.Bat para introducir datos en la primer "columna" de un csv

He estado hurgando en hilos anteriores del foro buscando una ayuda a mi problemática. Sin más preámbulo, lo que estoy buscando es la siguiente:
Tengo un archivo, ipArchivo. Csv de la siguiente forma:
Soy, un, archivo, csv
Soy, un, archivo, csv
Soy, un, archivo, csv
Soy, un, archivo, csv
Con diferentes datos por línea, quisiera insertarle la ip, que se encuentra en el nombre del archivo en la primer columna a todas las filas del archivo para que quede de la siguiente manera:
Ip, soy, un, archivo, csv
Ip, soy, un, archivo, csv
Ip, soy, un, archivo, csv
Ip, soy, un, archivo, csv
Y hacer esto para varios archivos dentro de un mismo directorio que cumplen con la misma condición. La idea final sería levantar todos estos csv (que en un principio tienen datos indiferenciables), pero agregarle un identificador a cada uno en la primer columna para poder hacer un tratamiento de datos adecuado.
No he dado con la solución ya que mi manejo de ms dos es bajo.

1 respuesta

Respuesta
1

Prueba con esto:

@echo off
set carpeta=d:\carpeta prueba
pushd %carpeta%
for /f "tokens=* delims=" %%i in ('dir /b *.csv') do call :tratarch "%%i"
popd
goto :eof
:tratarch
del /q tmp.txt
for /f "usebackq tokens=*" %%a in ("%~1") do echo %~n1, %%a>>tmp.txt
echo copy /y tmp.txt %1

En la variable CARPETA pones el path del directorio donde están los CSV que quieres tratar. Si no fueran todos los CSV de la carpeta sino solo los que, por ejemplo, empiezan por 192 (de la IP local), deberías retocar el comando DIR del primer FOR. Tal como está el BAT que te ofrezco no reescribe los archivos sino que deja en el archivo TMP.TXT el último archivo modificado y saca por pantalla el COPY que lo reescribiría. Le echas un vistazo al último TMP.TXT y si consideras que lo está haciendo como quieres le quitas el ECHO al último comando para que haga realmente el COPY.

Ya me contarás.

Acabo de caer en la cuenta de que no me ha quedado muy claro si quieres mantener separados cada uno de los CSV o si quieres unificarlos (cosa que podría ser razonable una vez que has identificado cada fila con la IP de la que proceden). En este segundo caso el BAT podría ser:

@echo off
set carpeta=d:\carpeta prueba
pushd %carpeta%
del /q tmp.csv
for /f "tokens=* delims=" %%i in ('dir /b *.csv') do call :tratarch "%%i"
popd
goto :eof
:tratarch
for /f "usebackq tokens=*" %%a in ("%~1") do echo %~n1, %%a>>tmp.csv

Y el archivo unificado sería el TMP.CSV

gggirald , muchas gracias por la pronta respuesta. Tal y como intuiste, mi objetivo era el segundo caso. Te cuento que estuve probando implementarlo y no se me genera en ningún momento el tmp.csv.
Espero respuesta, saludo.

Te actualizo:
Logré hacer que funcione cambiando así esta línea, los archivos se interpretan com csv pero no cuentan con la extensión y por ello no funcionaba.

for /f "tokens=* delims=" %%i in ('dir /b *') do call :tratarch "%%i"

Por otro lado, el resultado lo que está haciendo actualmente es tomar el 1er archivo, e insertarle los 7 primeros dígitos de la ip, para esto veo dos problemas:
En primer lugar, el copiar solo 7 dígitos de la ip, puedo estar duplicando información, pues tengo varias que son iguales hasta los 7 primeros dígitos, para solucionar esto, debería poder copiar 12 dígitos, o en su defecto todo el nombre del archivo (es meramente para diferenciar los datos, luego será renombrado).
En segundo lugar, se creó el tmp.csv, pero este contiene los datos solamente del primer archivo de la lista.
Se me ocurre ahora, sobre escribir los archivos existentes por los que contienen la nueva columna y luego hacer un copy a un archivo unificado.
Nuevamente necesitaría de tu ayuda, saludo. 

El problema viene de que los archivos no tengan "extensión". Creo que, partiendo de ese dato, el bat debería quedar así:

@echo off
set carpeta=d:\carpeta prueba
pushd %carpeta%
del /q tmp.csv
for /f "tokens=* delims=" %%i in ('dir /b *') do call :tratarch "%%i"
popd
goto :eof
:tratarch
for /f "usebackq tokens=*" %%a in ("%~1") do echo %1, %%a>>tmp.csv

Prueba y me dices. Ahora tengo que irme y hasta esta noche  no podré ponerme con ello.

¡Gracias! Esa última funcionó como esperaba, con unos cambios más quedó pronto el proceso. Gracias por tu tiempo. ¡Saludo!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas