Eliminar ultima línea de un csv

Tengo unos archivos csv que son creados por bat, pero al final de cada texto me sale algo un carácter que no permite la lectura de los csv y quiero eliminar la ultima línea con algún bat

11/17/2020 6:30:00 AM, Lake/res elevation, GAT, 86.98, ft, 1,, 1, Gatun, Telem AVG
11/17/2020 6:45:00 AM, Lake/res elevation, GAT, 86.98, ft, 1,, 1, Gatun, Telem AVG
11/17/2020 7:00:00 AM, Lake/res elevation, GAT, 86.98, ft, 1,, 1, Gatun, Telem AVG


Como pueden ver me aparece " " y quiero eliminarlo con un comando bat.

Respuesta
1

He llegado un poco por casualidad a esta consulta. No acabo de entender muy bien el problema porque por un lado dices al final de cada texto y luego dices Como pueden ver me aparece " " .

Intuyo que solo quieres eliminar la última línea de cada archivo que tal vez sea una línea en blanco o con algún carácter extraño.

Por si acaso te pongo por aquí un bat que hice hace tiempor para eliminar la última línea de un archivo que se le pasa como parámetro. Si consideras que puede valer me lo dices y ya lo ajustamos para que haga un tratamiento general de toda una serie de archivos (por ejemplo todos los CSV):

:: Elimina ultima línea de un archivo (por ejemplo el fin de archivo 0x1A)
@echo off
Setlocal EnableDelayedExpansion
del kkk.txt
if "%1" == "" goto ayuda
for /f "tokens=*" %%i in ('type %1 ^| find /v /c "" ^< %1') do (set nlin=%%i)
set /a nlin=%nlin%-1
for /f "tokens=*"  %%i in (%1) do (
if "!nlin!" == "0" goto fin
echo %%i>> kkk.txt
set /a nlin=!nlin!-1
)
goto fin
:Ayuda
Echo Elimina la linea final del archivo
Echo Posible problema colateral -> Elimina las lineas en blanco
Echo Formato: %0 archivo
Echo El archivo corregido se deja en kkk.txt
Echo Ejemplo:
echo %0 kk.txt
:Fin

Ya me contarás.

Buenas tardes,

:: Elimina ultima línea de un archivo (por ejemplo el fin de archivo 0x1A)
@echo off
Setlocal EnableDelayedExpansion
del Tableau15Min.csv
if "%1" == "" goto ayuda
for /f "tokens=*" %%i in ('type %1 ^| find /v /c "" ^< %1') do (set nlin=%%i)
set /a nlin=%nlin%-1
for /f "tokens=*" %%i in (%1) do (
if "!nlin!" == "0" goto fin
echo %%i>> Tableau15Min.csv
set /a nlin=!nlin!-1
)
goto fin
:Ayuda
Pause
Echo Elimina la línea final del archivo
Echo Posible problema colateral -> Elimina las líneas en blanco
Echo Formato: %0 archivo
Echo El archivo corregido se deja en Tableau15Min.csv
Echo Ejemplo:
echo %0 kk.txt
:Fin

Adaptando este archivo

Le deje el enlace del archivo que quiero eliminar, pero al aplicar el bat, se borra y no hace la corrección.

https://1drv.ms/u/s!Arf_hb3tghih0Hq_UI1-WGO067yb?e=BbqcgK

No se trataba de que adaptaras el bat. Tal como lo dejé era utilizable pero había que "invocarlo" pasándole el nombre del archivo a tratar.

Tal como lo has hecho es normal que se borre el archivo puesto que tercer comando de tu bat adaptado es, precisamente, "del Tableau15Min.csv" que es eso lo que hace, borrar el archivo.

Digamos que salvas mi bat original en la carpeta en la que tienes el archivo al que le quieres eliminar la última fila (Tableau15Min. Csv) y que le llamas BorUltFila.bat. Abres una ventana CMD/Símbolo del sistema, te sitúas en la carpeta en cuestión y tecleas:

Borultfila Tableau15Min. Csv

si todo va bien, que espero que sea así, te creará un archivo de nombre KKK.TXT que debe ser igual al archivo original pero sin la última fila. Lo renombras a KKK. CSV, por ejemplo, y compruebas si cumple lo que se espera de él.

Intuyo que no conoces la herramienta "snippet" de la página, que se abre con el icono "<>", el tercero desde la parte derecha de la barra. Es el que puede usarse para abrir una ventanita como la que yo usé para mi BAT o para este comando de invocación del BAT. Considero que así es más legible, al separar el código, del texto de la consulta/repuesta.

Por último he intentado descargarme el CSV entrando en el enlace de OneDrive pero solo consigo descargarme un XLSX o un ODS y me temo que en ese caso ya puede resultar alterado el valor de esa última fila que quieres eliminar. Y, de todas formas, no aprecio ningún problema como el que comentabas "al final de cada texto me sale algo un carácter que no permite la lectura de los csv"

He preparado un bat para hacer el borrado de la última línea de todos los CSV de una carpeta. Sería este:

:: Elimina ultima línea de archivos seleccionados
@echo off
set carpeta=d:\carpeta prueba
pushd %carpeta%
for /f "delims=" %%x in ('dir /s /b *.csv') do call :borultlin "%%x"
popd
goto :eof
:borultlin
Setlocal EnableDelayedExpansion
echo tratando %1
del /q temp.txt>nul 2>&1
for /f "tokens=*" %%i in ('type %1 ^| find /v /c "" ^< %1') do set nlin=%%i
set /a nlin-=1
for /f "usebackq tokens=*"  %%i in (%1) do if not "!nlin!" == "0" echo %%i>> temp.txt&set /a nlin-=1
copy /y temp.txt %1>nul
Endlocal

He dejado un ECHO para que vaya diciendo que archivo está tratando. Habría que "ajustar" la variable CARPETA para que contenga el path de los archivos a tratar. Tal como está reescribiría cada uno de los archivos después de borrar la última línea. Si se quiere que no lo haga durante las pruebas bastaría con anteponer un ECHO a la penúltima línea. En ese caso el TEMP.TXT contendría las líneas del último archivo tratado (menos la última, que se habría eliminado)

:: Elimina ultima línea de un archivo (por ejemplo el fin de archivo 0x1A)
@echo off
Setlocal EnableDelayedExpansion
del kkk.txt
if "%1" == "" goto ayuda
for /f "tokens=*" %%i in ('type %1 ^| find /v /c "" ^< %1') do (set nlin=%%i)
set /a nlin=%nlin%-1
for /f "tokens=*"  %%i in (%1) do (
if "!nlin!" == "0" goto fin
echo %%i>> Tableau15Min2.csv
set /a nlin=!nlin!-1
)
goto fin
:Ayuda
Echo Elimina la linea final del archivo
Echo Posible problema colateral -> Elimina las lineas en blanco
Echo Formato: %0 archivo
Echo El archivo corregido se deja en kkk.txt
Echo Ejemplo:
echo %0 kk.txt
:Fin

Me funciona muy bien el bat como esta, solo que quiero que el "Tableau15Min2.csv" borre el original y coloque el archivo procesado por el bat "Tableau15Min.csv"

Has hecho algo un poco raro con el bat porque usas un archivo ("Tableau15Min2.csv") en lugar del KKK.TXT y eso no tiene validez general. Si lo que quieres es que se reescriba el archivo al que le apliques el bat sería mejor algo así:

:: Elimina ultima línea de un archivo (por ejemplo el fin de archivo 0x1A) y lo reescribe
:: Utiliza un archivo temporal de nombre kkk.txt
@echo off
Setlocal EnableDelayedExpansion
del kkk.txt
if "%1" == "" goto ayuda
for /f "tokens=*" %%i in ('type %1 ^| find /v /c "" ^< %1') do (set nlin=%%i)
set /a nlin=%nlin%-1
for /f "tokens=*"  %%i in (%1) do (
if "!nlin!" == "0" goto fin
echo %%i>>kkk.txt
set /a nlin=!nlin!-1
)
copy /y kkk.txt %1
goto fin
:Ayuda
Echo Elimina la linea final del archivo y lo reescribe despues
Echo Posible problema colateral -> Elimina las lineas en blanco
Echo Formato: %0 archivo
Echo Ejemplo:
echo %0 kk.txt
:Fin
rem ######################## USOS DE AGUA ########################
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="EsclusasDailyACLL.csv" /TimeSeries="Discharge Total.Esclusas@ACLL"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="EsclusasDailyCCLL.csv" /TimeSeries="Discharge Total.Esclusas@CCLL"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="EsclusasDailyPMGL.csv" /TimeSeries="Discharge Total.Esclusas@PMGL"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="EsclusasDailyGATL.csv" /TimeSeries="Discharge Total.Esclusas@GATL"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="PotabilizadorasDailyGATP.csv" /TimeSeries="Discharge Total.Potabilizadoras@GATP"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="PotabilizadorasDailyMADP.csv" /TimeSeries="Discharge Total.Potabilizadoras@MADP"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="HidrogeneracionDailyGAT.csv" /TimeSeries="Discharge Total.Hidrogeneracion@GAT"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="HidrogeneracionDailyMAD.csv" /TimeSeries="Discharge Total.Hidrogeneracion@MAD"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="VertidosDailyGAT.csv" /TimeSeries="Discharge Total.Vertidos@GAT"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="VertidosDailyMAD.csv" /TimeSeries="Discharge Total.Vertidos@MAD"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="CCADailyACLL.csv" /TimeSeries="Discharge Total.Control de Calidad del Agua@ACLL"
if %res% EQU 1    "C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\RunReport.exe"   /Report="Export Table" /Server=aquarius /UserName=CONT-KSharpe /Password=CONT-KSharpe /OutputFile="CCADailyCCLL.csv" /TimeSeries="Discharge Total.Control de Calidad del Agua@CCLL"
if %res% EQU 1 copy *15Minutes* Tableau15Min.csv
if %res% EQU 1 copy *Daily* TableauDly.csv
if %res% EQU 1 del *15Minutes*
if %res% EQU 1 del *Daily*
if %res% EQU 1 "C:\Users\%USERNAME%\Desktop\Pruebas\Borultfila.bat" Tableau15Min.csv
if %res% EQU 1 "C:\Users\%USERNAME%\Desktop\Pruebas\Borultfila.bat" TableauDly.csv

Ahora si me trabajo el bat como queria.

:: Elimina ultima línea de archivos seleccionados
@echo off
set carpeta=C:\Users\%USERNAME%\Downloads\Aquarius
pushd %carpeta%
for /f "delims=" %%x in ('dir /s /b *.csv') do call :borultlin "%%x"
popd
goto :eof
:borultlin
Setlocal EnableDelayedExpansion
echo tratando %1
del /q temp.txt>nul 2>&1
for /f "tokens=*" %%i in ('type %1 ^| find /v /c "" ^< %1') do set nlin=%%i
set /a nlin-=1
for /f "usebackq tokens=*"  %%i in (%1) do if not "!nlin!" == "0" echo %%i>> temp.txt&set /a nlin-=1
copy /y temp.txt %1>nul
del temp.txt
Endlocal

Le agregue "del temp.txt" porque sino el programa me lee los txt y csv, pero alli lo acomode a mis necesidades, asi pude resolver, quedo genial! 

Me alegro mucho de que te haya servido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas