Unir ficheros csv con un bat

Tengo un grupo de ficheros *. Csv que quiero unir.

Lo que necesito es ignorar la primera línea y que al final se unan todos en un fichero con otro nombre dado por la fecha.

He conseguido unirlos y guardarlos con el nombre deseado, pero no me ignora la primera línea y además salen caracteres raros del tipo "<0x1a>".

Me pueden ayudar por favor.

Uso el siguiente código

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "fecha_hora=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
set carpeta="D:\csv"
pushd %carpeta%
set archivo=FUSION-%fecha_hora%.csv
Echo. >"%archivo%"
for /f "skip=1 tokens=*" %%i in ('dir /b *.csv') do ( copy "%archivo%" + "%%i" "%archivo%")
exit

2 Respuestas

Respuesta
1

Prueba con esto:

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "fecha_hora=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
set carpeta="D:\csv"
pushd %carpeta%
set archivo=FUSION-%fecha_hora%.csv
for /f "tokens=*" %%a in ('dir /b *.csv') do (for /f "usebackq skip=1 tokens=*" %%x in ("%%a") do echo %%x >>"%archivo%")
popd
rem exit

Te comento lo que creo que pueden ser algunos errores en tu BAT:

1. El intento de crear el archivo FUSION-%fecha_hora%. Csv mediante el comando echo. >"%Archivo%" hace que ese archivo contenga una línea en blanco. Para conseguir un archivo vacío hubiera sido mejor el comando copy nul "%archivo%"

2. El SKIP=1 de tu segundo FOR supongo que pretende saltarse la primera línea de cada archivo pero lo que hace es ignorar la primera línea del comando DIR /B *. CSV

3. Cada ejecución del COPY "%ARCHIVO%" + "%%I" "%ARCHIVO%" añade al final el carácter 0x1A que era el carácter de fin de fichero en el viejo MSDOS

Realmente tienes que hacer un tratamiento línea a línea de cada uno de los archivos CSV, sobre todo si quieres eliminar la primera línea

Perdón, no me había fijado que ya te habías contestado tú mismo.

Me parece muy interesante tu solución.

He estado dándole vueltas a tu solución y me parece que se puede simplificar así:

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "fecha_hora=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
set carpeta="D:\csv"
pushd %carpeta%
set archivo=FUSION-%fecha_hora%.csv
>%archivo% (for %%f in (*.csv) do more +1 "%%f")
Popd

A lo mejor me he pasado de listo pero en mis pruebas funciona correctamente

Respuesta
1

Ya lo he conseguido con este código

@echo off
Setlocal
set first=1
>new.csv.tmp (
  for %%F in (*.csv) do (
    if defined first (
      type "%%F"
      set "first="
    ) else more +1 "%%F"
  )
)
Ren new. Csv.tmp "%archivo%"

No sé si habrá algo mejor, estoy abierto a sugerencias, pero esto me ha funcionado y por si le sirve a alguien.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas