Insertar datos de un .csv en un campo x para ejecutar un comando en batch

Tengo un comando en un .bat que debo ejecutar pero necesito completar ciertos campos antes con datos que se encuentran en un archivo .csv (el csv tiene 3 columnas y 10 filas separados por ; ).

Parte del comando es este: "input_match=['<dato01>','<dato02>','<dato03>'], donde dice: dato01, dato02, dato03 debe ir lo que esta en el csv.

Es posible (y como) rellenar automaticamente estos campos para ejecutar el .bat y ademas que lo haga, ¿lea cada fila inserte los datos y ejecute uno por uno?

1 Respuesta

Respuesta
1

Entiendo que lo que quieres es ejecutar un comando desde un BAT (en realidad uno por cada línea del CSV) rellenando parte de los parámetros con la información de las líneas del CSV.

Prueba con esto:

@echo off
set nomarch=kkk.csv
for /f "tokens=1,2,3 delims=;" %%a in ('type %nomarch%') do (
COMANDO input_match=['%%a','%%b','%%c']
)

Donde pongo kkk. Csv pones el nombre del CSV y donde pongo COMANDO el comando que quieres ejecutar. Y me cuentas si tienes algún problema.

Estimado, muchas gracias por tu respuesta y ayuda!! funciono a la perfección!

Solo 2 consultas mas:

1-. Como puedo indicar que comience a leer desde la segunda fila del .CSV? Ya que la primera fila viene con los encabezados de cada columna.

2-. Si requiero aumentar las columnas a 10 solo aumento el "tokens=1,2,3,4,5,6,7,8,9,10...?

Muchas gracias!!

Si tecleas en una ventana CMD el comando FOR /? te cuenta la sintaxis y el funcionamiento del FOR.

1. Para que se salte la primera fila basta incluir el parámetro SKIP=1 dentro de las comillas. Algo como FOR /F "SKIP=1 TOKENS=1,2,3 DELIMS=;"

2. Efectivamente. Los tokens los recoges en las variables %%a, %%b, %%c, etc. Creo que hay un límite pero probablemente tenga más que ver con la ordenación alfanumérica que con otra cosa, de modo que seguro que 10 los admite sin problemas.

Acabo de ver que en la ayuda del FOR dice que el máximo de tokens es de 26 (las 26 letras de la A a la Z)

Muchas gracias GGGIRALD.

Tengo otra duda, haber si tu sabiduría puede ayudarme:

Actualmente estoy tomando el archivo CSV con un nombre fijo, ejem: RFC-(Fechaactual).csv

Pero este archivo no siempre tendrá el mismo nombre, ya que diariamente cambiara por la fecha o bien se modificara, pero si tendrá SIEMPRE el prefijo: RFC-........ .csv

Habra alguna forma de que el comando pueda tomar el archivo que comience con el prefijo: RFC- y ademas pueda seleccionar el que tenga la fecha actual? Ya que cabe la posibilidad que existan diversos archivos con RFC- pero debe tomar el con la fecha actual.

Muchas gracias!

No acabo de entender lo que quieres. Si el archivo tiene un nombre determinado relacionado con la fecha de hoy, en el formato que sea, pues bastaría poner ese nombre RFC-hoy. CSV.

Otra cosa sería utilizar la fecha interna de creación del archivo.

Para que te hagas una idea, esto te permitirá seleccionar archivos con ese nombre y fecha de creación de hoy colgando de la carpeta "%USERPROFILE%\Mis documentos":

@echo off
Setlocal EnableDelayedExpansion
set hoy=%date:~6,4%%date:~3,2%%date:~0,2%
for /r "%USERPROFILE%\Mis documentos" %%x in (RFC-*.csv) do (
set fecha=%%~tx
set fecha=!fecha:~6,4!!fecha:~3,2!!fecha:~0,2!
if !fecha! GEQ %hoy% echo Encontrado archivo %%x con fecha archivo: !fecha! y hoy es: %hoy%
)
)

¡Muchas Gracias! GGGirald!

Una consulta más: ¿Sabes cómo pasar este mismo código pero a bash linux?

@echo off
set nomarch=kkk.csv
for /f "tokens=1,2,3 delims=;" %%a in ('type %nomarch%') do (
COMANDO input_match=['%%a','%%b','%%c']
)

Agradecería mucho tu ayuda! Gracias

No manejo mucho Linux, aunque tengo una partición en un equipo con ese sistema operativo, pero ahora no estoy en casa y no volveré hasta finales de julio. Para entonces podría hacer alguna prueba y te diría algo. Pero las shells de Linux son, en general, mucho más potentes de modo que seguro que puede hacerse.

Ya he vuelto a casa y he podido hacer pruebas en Linux. Como ya dije no tengo mucha experiencia en este sistema operativo pero esto podría funcionar, creo:

#! /bin/bash
nomarch=kkk.csv
while IFS=\; read var1 var2 var3 var4
do
   COMANDO input_match=[\'$var1\', \'$var2\', \'$var3\']
Done < $nomarch

Supongo que sabes que hay que modificar los permisos para que el SH que crees tenga permisos de ejecución y esas cosas. Ya me dirás.

El editor de la página me ha cambiado, sin permiso, el "done" por "Done" y Linux no tolera esos cambios. Así que tendrás que arreglarlo antes de ejecutar el script

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas