Modificación por lotes (u otra?) de una columna CSV

brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención   -  
brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención   -
Bonjour,

Me han pasado un bebé complicado de cuidar: se extrae un archivo CSV de una base de datos (de la cual no sé nada) a través de un script VBS.

Pregunta secundaria, el archivo CSV muestra los caracteres acentuados (no sé si son correctos en la base de datos) en modo jeroglífico; ¿hay en VBS, que no entiendo, un medio simple como en Batch para solucionarlo?

La fecha se presenta, en la columna 2, en el formato

AAAA-MM-DD HH:MM.SSS

aunque la función de fecha de VBS utiliza un formato diferente, pero probablemente solo recupera la fecha del sistema en formato largo:


dateMaintenant = now()
maintenant = sprintf("{0:yyyyMMddHHmmss}", Array(dateMaintenant))


Aparte de los acentos, el objetivo de la maniobra es obtener un formato de fecha

AAAAMMDDHHMM

En un archivo de muestra donde solo tomo 2 columnas, no hay problema, salvo que sería más simple redirigir la columna 2 modificada a un archivo externo y luego reemplazarla en el archivo original, pero no sé cómo hacerlo:


@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
(
FOR /f "tokens=1-2 usebackqdelims=|" %%a IN ("input.csv") DO (
SET "Row2=%%b"
SET "Row2=!Row2:-=!"
SET "Row2=!Row2: =!"
SET "Row2=!Row2::=!"
SET "Row2=!Row2:.=!"
SET "Row2=!Row2:~0,12!
SET "Row1=%%a"
ECHO "%%~a"^|!Row2!>>output.csv
)
)
GOTO :EOF


Aquí es donde se complica, ya que el archivo a procesar contiene no solo un gran número de líneas, incluida la primera de títulos que no se debe tratar (eso no importa), sino también 70 columnas separadas por el símbolo de tubo "|".

Siempre se puede considerar, aunque no es muy elegante, escribir 70 variables Row(n), pero el problema es que Tokens solo acepta 31 y la condición FOR 26 variables.

Se puede leer aquí y allá que hay trucos tanto para aumentar el número de Tokens, por ejemplo:
https://stackoverflow.com/questions/980791/number-of-tokens-limit-in-a-for-command-in-a-windows-batch-script
o de variables:
https://stackoverflow.com/questions/22867421/how-to-assign-more-than-26-variables-with-for-loop?noredirect=1&lq=1
anidando comandos FOR, pero la implementación no está clara en mi mente.

Gracias.

2 respuestas

barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930
 
Hola brucine,

Si solo tienes una columna para modificar (columna 2) no necesitas tener 70 variables.
Puedes mantener tu %%a y %%b y poner el resto en %%c.

¿Te ayuda eso o no?

--

“La inteligencia artificial se define como lo contrario de la estupidez natural.”
0
brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención   4 143
 
Hola Barnabé,

Ahí es donde no entiendo, tengo la cabeza embotada hoy: si redirijo las 2 primeras columnas como lo hice en un archivo de salida y añado %%c, ¿solo me va a sacar la 3ª columna, no las 68 que quedan?
0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención  
 
Usando tu ejemplo, algo así debería funcionar:

@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION ( FOR /f "tokens=1,2,* usebackq delims=|" %%a IN ("input.csv") DO ( SET "Row2=%%b" SET "Row2=!Row2:-=!" SET "Row2=!Row2: =!" SET "Row2=!Row2::=!" SET "Row2=!Row2:.=!" SET "Row2=!Row2:~0,12! SET "Row1=%%a" ECHO "%%~a"^|!Row2!^|%%c>>output.csv ) ) GOTO :EOF
0
brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención   4 143 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
 
De hecho, tonto y malo, ni siquiera lo intenté y me volví loco todo el día con eso porque estaba convencido de que %%c solo me estaría sacando la tercera columna aunque, de hecho, no está "expandido".

Gracias.
0
barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 930 > brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención  
 
De nada ;-)

Si tienes muchas variables que procesar, también podrías haber utilizado una función a la que le pases tantos parámetros como tengas de variables, y luego pasas de un parámetro al siguiente utilizando el comando shift.
0
brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención   4 143 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
 
Sí, claro, pero con eso es suficiente para las necesidades de la causa sin volver a escribir código "por placer".
0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Ambassadeur 1 588
 
hola,
no he entendido todo, pero, en VBS, podrías utilizar split(), que crea un arreglo a partir de una cadena de caracteres, basado en un separador que se pasa como parámetro.

VBS es mucho más "rico" que un batch, permite hacer todo lo que se puede hacer en VB o en VBA, excepto, para el VBA, la integración con la aplicación anfitriona de Microsoft (Excel, ...).
0
brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención   4 143
 
Buenas noches,

Totalmente y también probablemente por otras vías más "elegantes" (Python, utilidades de Linux tipo sed, pero que estaban excluidas de todos modos porque no soy yo el usuario y hay que hacer con los medios a mano...).

Pero aparte, como he dicho, de que no entiendo nada de VBS, no tengo acceso al archivo de datos, así que tengo pocas posibilidades de entender qué es lo que hay que extraer y en qué formato, y tampoco puedo probar nada, así como no conozco el formato de fecha original en la base de datos.
0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención  
 
solo muestras una parte del VBS, y no creo que esta parte trate sobre los datos del archivo CSV, ni genere acentos.
0
brucine Mensajes publicados 24668 Fecha de registro   Estado Miembro Última intervención   4 143 > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
 
El VBS extrae los datos de una base de datos, aparentemente se trata de transcripciones de audio, hacia un archivo CSV.
No tengo la base de datos, y no puedo subir el VBS ni un extracto del CSV que son confidenciales.

Sin embargo, la única declaración de formato en el VBS se refiere a la fecha (y está mal construida ya que no produce el formato deseado, pero no tiene sentido que intente cambiarla ya que no tengo la base de datos para probar).

Los caracteres acentuados ya están presentes en la base de datos o, un poco como sucede en Batch, se extraen en la tabla de caracteres equivocada; solo hay un caso específico, respecto a datos que pueden tener múltiples procedencias, donde existe una sintaxis split para nombres que pueden estar acentuados, nunca para la dirección, y sin formato aparente:

strNomClient = Split(strLine, separateurFichierExport)(14)
0