Cómo puedo agregar archivos de txt en .bat pero que el segundo archivo se pegue al primero en la siguiente columna del primero
Necesito pegar varios archivos de txt pero que se vayan pegando como columnas, no que el segundo se pegue debajo del primero en filas.
1 Respuesta
No entiendo bien lo que quieres porque no sé como se pueden entender las "columnas" en un txt. Si cada archivo tiene poco información y lo que quieres es, por ejemplo, ir añadiendo un tabulador o un determinado número de espacios antes de añadir el texto y suprimir los cambios de línea si los hubiera, tal vez se pueda intentar. Otra posibilidad, creo, podría ser crear un CSV para tratarlo con Excel.
Pon un ejemplo, si te parece, para ver si puedo entenderte mejor.
¡Gracias! GGGIRLAD. OK, mira tengo varios TXT. La estructura de cada uno es similar, por ejemplo:
título_txt1
1.2565
2.5898
2.3656
2.3445
Es un listado de números. El siguiente txt tiene una estructura similar, lo que quiero es que el siguiente archivo me lo pegue de la siguiente forma
título_txt1 título_txt2
1.2565 3.258
2.5898 5.369
2.3656 2.102
2.3445 5.236
es decir enfrente del anterior. Espero haber sido claro y me puedas ayudar un poco. Muchas gracias.
Esto es un poco chapucilla pero creo que puede funcionar o, al menos, ser un punto de partida. He llamado cc1.txt y cc2.txt a los archivos de partida:
@echo off Setlocal EnableDelayedExpansion del kkk.txt for /f "tokens=*" %%a in (cc1.txt) do ( set dat1=%%a for /f "tokens=*" %%k in (cc2.txt) do ( set dat2=%%k echo !dat1! !dat2! >>kkk.txt goto trat ) ) :trat set /a lin = 1 :bucle for /f "skip=%lin% tokens=*" %%a in (cc1.txt) do ( set dat1=%%a for /f "skip=%lin% tokens=*" %%k in (cc2.txt) do ( set dat2=%%k echo !dat1! !dat2! >>kkk.txt if "!dat2!"==goto fin set /a lin = !lin! + 1 goto bucle ) ) :Fin
Como sé por experiencia que, a veces, no conseguimos lo mismo te pongo a continuación una "prueba" de que funciona, más o menos, como te interesa:
D:\BAT>type cc1.txt título_txt1 1.2565 2.5898 2.3656 2.3445 D:\BAT>type cc2.txt título_txt2 3.258 5.369 2.102 5.236 D:\BAT>type kkk.txt Este es el contenido del archivo kkk.txt antes de ejecutarse el bat. Lo normal es que no exista la primera vez pero eso no importa. D:\BAT>cc D:\BAT>type kkk.txt título_txt1 título_txt2 1.2565 3.258 2.5898 5.369 2.3656 2.102 2.3445 5.236 D:\BAT>
Los resultados se recogen en el archivo kkk.txt. Si en la primera ejecución no existe ese archivo dará un mensaje diciéndolo pero eso no afecta al funcionamiento de lo demás. Ya me dirás.
Muchas gracias por la ayuda, lo estoy probando, aquí mismo comento si el resultado fue el deseado. GRACIAS
Aún no, pero ya resolví lo del signo =, en lugar de suprimirlo cambié de lógica y mejor lo agrego y no tiene bronca en agregarlo como cadena. Hoy pruebo esta solución de pegar los txt y comento. Gracias
Mi estimado GGIRALD. Probadísima la sugerencia y claro que funciona y obtuve el resultado que quería. Muchísimas gracias!! son 7 txt los que pegué y sin problema :D. Ahora eso lo copio a un xls pero me lo copia todo el renglón en la misma celda, ¿sabes cómo hago para que esas columnas del txt me las acomode en las columnas del xls? Saludos y muchas gracias. Bendiciones!!
Como ya apuntaba en mi primera respuesta, si el destino de esas "columnas" va a ser Excel lo que creo que debes hacer es darle formato de CSV, es decir, separar lo campos por el carácter regional del CSV (la coma en el caso de entornos tipo "inglés" o el punto y coma en entornos de tipo "español"). Si no sabes en que entorno estás, genera de forma manual un archivo con unos cuantos campos separados por comas (",") y otro con los campos separados por punto y coma (";"), guárdalos con extensión CSV y ábrelos dejando que lo haga con Excel. Uno de ellos debería sacar los campos en columnas diferentes y ese sería el carácter a utilizar para separar los campos en el bat. Supongamos que fuera el ";", tendrías que sustituir los comandos:
Echo ! Dat1! ! Dat2! >>kkk.txt
Por
Echo ! Dat1!;! Dat2! >>kkk.txt
Pruébalo y me dices lo que ocurre. Si no te funciona ninguno de ellos intenta localizar en la "Configuración regional y de idioma" (ahora mismo no sé como se llamará esa opción en Windows 7, 8 o 10 pero seguro que el Cortana te ayudará en este último caso) un parámetro que se llame algo como "separador de listas". El valor de ese parámetro sería el que se debe usar, aunque a lo mejor hay que hacer algo en Excel para que lo reconozca adecuadamente.
Excelente brother!!! así es, salió con la coma (,). Así ya lo abro con excel y me lo separa por columnas. Mil gracias.
Qué tal GGIRALD. Ya salió lo de las columnas. ahora estoy usando ese mismo principio para poner un txt en formato .csv de tal forma que al abrirlo en excel lo separe por columnas, como el ejercicio anterior. Pero no me sale. intenté con la sintaxis que me pasaste, eligiendo una palabra a la vez. Sabes cómo puedo pasar un txt a un csv de tal manera que al abrirlo me lo separe en las columnas de excel? te digo probé con lo que hice en el otro pero no salió. Saludos
Pero en el caso de un solo archivo, ¿cuál es el criterio para definir la columna?
Si lo que quieres es que convierta en una sola columna todas las palabras de un archivo (que estaban previamente separadas por espacios) bastaría con hacer algo cómo:
@echo off del kkk.txt for /f "tokens=*" %%a in (cc.txt) do (call :tratar %%a) :tratar if "%1"=="" goto :fin echo %1>>kkk.txt Shift goto :tratar :Fin
Si no es eso lo que quieres ponme un ejemplo.
Por supuesto, en el ejemplo anterior cc.txt es el archivo de partida y el resultado lo dejaría en kkk.txt.
Hola GGIRALD. Tengo un archivo de texto con palabras separadas por espacios, digamos que cada palabra será una columna, y hay 3 palabras por renglón, en algunos renglones solo hay una palabra. Lo que quiero es que cada palabra de cada renglón me la ponga en una columna de excel. Lo que hago es crear el archivo de texto y abrirlo desde excel e importarlo como separación por espacios, pero quiero ver si se puede hacer en automático, sin necesidad de ir a excel y hacer ese proceso. Te pongo un ejemplo:
.TXT
IPO332
lag 1 .3654
lag 2 .2585
IPO335
lag 12 .256
lag 5 .25689
en el reglón 1 la primera palabra sería IPO332 y esa sería la única, iría en la primera columna del excel; en el segundo renglón la primera palabra sería lag, la segunda 1, la tercer .3654, cada una de ellas debería ir en la primera, segunda y tercera columna del mismo excel pero en el renglón 2; y así sucesivamente. Me explico?
Más o menos es lo que quiero hacer. Gracias por toda tu ayuda.
Oye, cuándo pones %1, qué quieres decir, es que no domino este tipo de programación. Tampoco lo de Shift. quizá son preguntas muy básicas pero no conozco las respuestas.
Saludos
Prueba con esto:
@echo off Del kkk. Csv for /f "tokens=*" %%a in (cc.txt) do (call :tratar "%%a") goto :fin :tratar set linea=%1 set linea=%linea: =,% set linea=%linea:"=% echo %linea%>>kkk.csv goto :eof :Fin
Tiene el problema de que si hay varios espacios separando campos generará una celda en blanco. Si eso supone problemas podríamos intentar alguna solución aunque tendría que ser algo menos general, más ajustado al caso concreto (dependiendo, por ejemplo, del número máximo de espacios que se espere encontrar).
Respecto a tu otra consulta cuando se utiliza el comando CALL (algo parecido a una llamada a una subrutina) lo que viene después del nombre de la subrutina (en este caso ":tratar") son los parámetros de la llamada separados por espacios y desde dentro de la rutina (igual que en las llamadas a un BAT) se individualizan como %1, %2, %3, etc. El comando SHIFT elimina el primer parámetro pero mantiene el orden (de manera que después de un SHIFT el %1 se refiere al parámetro que antes era el %2 y así sucesivamente). De modo que el uso del SHIFT en ese ejemplo permite tratar todos los parámetros sin necesidad de saber cuantos pueden ser.
No entendí muy bien lo del %1, pero funcionó a la perfección. Me sorprendes!!
Muchísimas gracias, me genera el archivo tal cual lo quiero.
Me alegro mucho de que te haya funcionado bien.
Por si te sirve para entender lo que te comentaba del %1 y del SHIFT mira esto:
D:\BAT>type cc.txt esta es una prueba de paso de parametros D:\BAT>type cc1.bat @echo off del kkk.txt for /f "tokens=*" %%a in (cc.txt) do (call :tratar %%a) goto :fin :tratar echo Todos los parametros: %* :bucle echo Primer parametro: //%1// Segundo parametro: //%2// Tercer parametro //%3// if "%1"=="" goto :eof echo %1>>kkk.txt shift goto :bucle :fin D:\BAT>cc1 Todos los parametros: esta es una prueba de paso de parametros Primer parametro: //esta// Segundo parametro: //es// Tercer parametro //una// Primer parametro: //es// Segundo parametro: //una// Tercer parametro //prueba// Primer parametro: //una// Segundo parametro: //prueba// Tercer parametro //de// Primer parametro: //prueba// Segundo parametro: //de// Tercer parametro //paso// Primer parametro: //de// Segundo parametro: //paso// Tercer parametro //de// Primer parametro: //paso// Segundo parametro: //de// Tercer parametro //parametros// Primer parametro: //de// Segundo parametro: //parametros// Tercer parametro //// Primer parametro: //parametros// Segundo parametro: //// Tercer parametro //// Primer parametro: //// Segundo parametro: //// Tercer parametro ////
Como puedes ver el segundo comando echo siempre presenta los parámetros %1, %2 y %3 (es decir, los tres primeros de la lista), pero estos parámetros se van desplazando por esa lista a medida que se va ejecutando el SHIFT (como indica el significado de esa palabra)
hola GGIRALD, una pregunta brother. En mi programa la salida que va acumulando en un txt son números con decimales, los quiero ordenar de mayor a menor y sí me lo hace pero tengo el problema en algunos casos muy raros. Lo que hago es convertirlos en número, pero solo me toma la parte entera. Hay alguna manera de que me tome el número como tal pero con todo y decimales? Muchas gracias, como siempre.
Imagino que la ordenación la haces en Excel y que el "separador decimal" es el punto (y no la coma, como se usa en España y otros países europeos). ¿Qué función Excel usas para convertirlos en número? ¿Puedes ponerme algún ejemplo de número decimal de los que te dan problemas?
hola GGIRALD, no lo hago en excel, corro un programa que genera resultados guardo parte de la salida en un .txt, lo corro en un ciclo de 15 veces modificando cada vez una parte de la sintaxis. El resultado que me arroja es este:
Easter[5] -4.05
Easter[6] -4.03
Easter[4] -4.00
Easter[7] -3.99
Easter[3] -3.92
Easter[2] -3.92
Easter[1] -3.92
Easter[8] -3.79
Easter[9] -3.59
Easter[10] -3.40
Easter[11] -3.23
Easter[12] -3.19
Easter[13] -3.14
Easter[14] -3.08
Easter[15] 0.00
entonces lo que hice es decirle que me lo acomode de mayor a menor, y el resultado me funciona. Pero el punto es que debe ser de mayor a menor sin importar el signo, es decir, en valor absoluto. Lo que hice fue convertirlos a positivos, para eso les sumé cero para que los tome como número y si es negativo multiplicarlo por 1. Pero al sumarle cero solo me toma la parte entera. El caso en que no me funcionaría es que haya número positivos y negativos. Lo que quiero es que al sumarle cero me reconozca los decimales y me deje el número tal cual está.
Muchas gracias como siempre. :)
Me temo que los comandos de BAT no tratan números decimales ni negativos. Por tanto no quedaría más remedio que hacer algún proceso que los convierta previamente en números naturales y, si es posible, volver a reconfigurarlos después de ordenarlos. ¿Siempre tienen dos números decimales? Si es así bastaría con quitarles el punto, hacer la ordenación y luego volver a ponerles el punto, pero no sé si eso funcionará.
Otra cosa.
Esta consulta tiene poco o nada que ver con la consulta original. Como creo que una de las grandes utilidades de la página es poner a disposición de otras personas soluciones a problemas conocidos, creo que hubiera sido mejor abrir una nueva consulta con un asunto relacionado con el nuevo problema, tal vez "tratamiento de números decimales" o algo así.
Puedes abrirla si crees que vamos a conseguir algo o dejarla estar. En todo caso seguiré atendiéndola, claro.
Ok GGIRALD, tienes razón, para futuras consultas abro mejor una nueva. :)
Lo que hice fue sumarle cero, si es negativo multiplicarlo por menos 1, luego ordenar con base en el entero resultante de esa suma y multiplicación y en segundo lugar lo ordena por los números decimales. Sí funciona porque solo tomo aquellos que tengan el estadístico mayor a 2 en valor absoluto. El problema lo tengo cuando los valores son menores a 1 porque hace todos cero, entonces si lo multiplico por menos 1 pues se hace cero. Pero en ese caso pues como no son significativos pues no importa mucho. De todas maneras muchas gracias por toda tu ayuda como siempre.
Según las pruebas que he estado haciendo parece que los comandos bat solo tratan números enteros (positivos y negativos) y que si en un número aparece un carácter no numérico (sea punto, coma, dos puntos, punto y coma, o cualquier otro que no tenga algún otro significado preasignado) solo se cuenta como número la parte anterior a ese carácter. Pero si todos los números tuvieran el mismo número de decimales se podría eliminar el separador decimal (el punto) utilizando los métodos de conversión dentro de una variable. No sé si te servirá de alto pero échale un vistazo a lo siguiente:
D:\BAT>type DecYNeg.bat @echo off set a=-1.57 set b=-3.25 set c=-.40 echo a vale: %a%, b vale: %b% y c vale: %c% set /a a=%a:.=% set /a b=%b:.=% set /a c=%c:.=% echo ahora a vale: %a% b vale: %b% y c vale: %c% D:\BAT>DecYNeg a vale: -1.57, b vale: -3.25 y c vale: -. 40 ahora a vale: -157 b vale: -325 y c vale: -40 D:\BAT>
Hay que tener en cuenta que si c fuera -0.40 acabaría convertido en -32 porque la eliminación del punto decimal lo dejaría como -040 pero el 040 significa que se trata de un número octal y 40 en octal son 32 en decimal. ¿Qué método usas luego para ordenar los números?
Hola GGIRALD. Aún no he intentado aplicar la solución que me envías, lo estoy checando, es factible siempre y cuando siempre el resultado que me genera mi programa sea con dos decimales, y creo que sí, entonces sí me funcionará. La ordenación la hago en primero lugar con el entero y después automáticamente se pasa a la segunda columna que contiene la cadena. Es curioso que aunque es cadena, para la ordenación sí lo reconoce como número porque toma en cuenta los decimales para ordenarlos. Esto me permite ordenar los valores de mayor a menor aunque tenga positivos y negativos. Por ejemplo, si tengo esta lista
Easter[2] -3.92
Easter[3] -3.92
Easter[4] -4.00
Easter[5] -4.05
Easter[6] 4.03
Easter[7] 3.99
Si lo ordenara solo por enteros me pondría primero todos los positivos y luego todos los negativos, lo cual no sería correcto dado el resultado que busco. Con la opción que te comento logro el siguiente resultado.
Easter[5] -4.05
Easter[6] 4.03
Easter[4] -4.00
Easter[7] 3.99
Easter[3] -3.92
Easter[2] -3.92
Ya están ordenado de mayor a menor sin tomar en cuenta el signo. :)
- Compartir respuesta