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 -
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:
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:
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.
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
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, ...).
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, ...).
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.
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.
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)
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)
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?
@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 :EOFGracias.
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.