Como eliminar la ultima fila de un archivo csv usando un .bat
Te comento mi situación:
Tengo un archivo .csv que se genera de una aplicación, esta aplicación le pone un carácter de fin de archivo al csv(ascii 27). La cuestión es que cuando intento importar este csv a otra aplicación me da un error por este carácter al final.
¿Cómo puedo usar un .bat para que me elimine este carácter (que esta en la ultima linea) del csv?
1 Respuesta
Si el carácter que te crea el problema fuera como dices el ASCII 27, que corresponde al ESC (escape) y no al fin de archivo (que es el ASCII 26), lo que quieres tendría su dificultad pero sería factible. Si realmente es un fin de archivo (ASCII 26) me temo que no hay solución con un BAT porque al meter ese carácter en el propio BAT se corta el BAT en el punto donde figure y ya no hará lo que se pretende.
Supongamos que fuera el carácter ASCII 27 que, como decía, corresponde al carácter ESC (escape) y no es fácil introducirlo en un BAT, ni en ningún archivo, con los editores normales. En particular el Bloc de notas permite escribirlo manteniendo pulsada la tecla Alt mientras se escribe 27 en el teclado numérico (¿y lo representa como?) Pero al intentar salvarlo si se elige modalidad ANSI se cambia el carácter por "?" y si se elige Unicode o UTF-8 se pierde totalmente la codificación. Salvando ese "pequeño" obstáculo el BAT siguiente creo que haría lo que necesitas:
@echo off
Setlocal EnableDelayedExpansion
if "%1" == "" goto ayuda
del kkk.txt
for /f "tokens=* delims=" %%i in (%1) do (set var=%%i&echo !var:?=! >> kkk.txt)
goto fin
:Ayuda
Echo Elimina el caracter ASCII 27 en todo el contenido de un 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
El carácter crítico es el "?" que figura en la línea del FOR (! Var:¿?=! ).
La única forma que se me ocurre de conseguir escribir el carácter ASCII 27 en un BAT es editarlo con un editor hexadecimal (como UltraEdit) que permita restaurar el carácter después de que lo haya alterado el Bloc de Notas. Es lo que he hecho yo para obtenerlo.
En el siguiente enlace te he dejado un comprimido que contiene el BAT Quita27.bat y un archivo de texto de prueba (PbaAsc27.txt) con dos caracteres ASCII 27 dentro del texto. Puedes revisarlos con TYPE y luego ejecutar el BAT sobre el archivo de prueba y comprobar que realmente ha eliminado esos caracteres:
http://1drv.ms/1dJkqBQ
Si realmente fuera un ASCII 27 la causa de tus problemas ese BAT debería resolvértelos, pero intuyo que no vamos a tener esa suerte.
Ya me contarás.
Que tal,
Me siento muy agradecido por que atendieras este tema.
Abajo esta la imagen del archivo y en la linea 6 veras el carácter del cual hablo. Según el programador que genera el archivo este es el carácter fin de archivo y precisamente por este carácter es que al momento de importarlo en otra aplicacion me manda error
Es posible que el .bat cuente todas las lineas del archivo y me elimine la ultima??
<h2> </h2>Tal como suponía tiene toda la pinta de ser el carácter ASCII 26 (puedes reproducirlo escribiendo en una celda vacía el 26 mientras tienes pulsada la tecla Alt: al soltarla te saldrá la flecha con la punta hacia la derecha, mientras que si lo haces con 27 te saldrá hacia la izquierda).
No se me ocurre una forma de que el BAT localice que está en la última línea de un archivo pero voy a pensar un poco más sobre ello y te diré algo.
Que tal,
Yo tengo esta que me cuenta la cantidad de lineas que tiene mi fichero.
@echo off
type LIQXUSRD.csv | find /v /c "" < LIQXUSRD.csv
Como yo se que siempre la ultima linea es la que trae el carácter especial. tendría que asignar a una variable la cantidad que trae el contador y luego decirle al .bat que borre la linea que concuerde con la cantidad que tiene la variable del contador.
así es que me lo imagino, pero no se como traducirlo al codigo!
Pues con la pista que me has dado creo que ya lo tenemos. Prueba con esto:
@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 el carácter ASCII 26 situado en 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
Posiblemente se pueda mejorar pero de momento vamos a ver si vale.
Ya me contarás.
Hola,
me puedes explicar ese código??? es que lo ejecuto y me borra el archivo, y no veo el nuevo archivo.
Me imagino que debo reescribar el kkk.txt por miarchivo.csv??
El archivo original no se borra (o no debería borrarse). Se borra el "archivo de trabajo", kkk.txt. Aunque si lo que has hecho es copiar el archivo original en el kkk.txt antes de empezar a trabajar sí que te lo borra, claro. Si al BAT le has llamado, por ejemplo, Quita26.bat deberías usarlo como
Quita26 LIQXUSRD. Csv
El primer FOR guarda en la variable nlin el número de líneas del archivo pasado como parámetro.
Luego se le resta 1 a la variable nlin para que copie todas las líneas menos la última.
El segundo FOR va leyendo línea a línea del archivo origen, las escribe en el archivo de trabajo si el contador de líneas es distinto de cero y va restando 1 al contador de líneas. Cuando llega a cero termina el programa y en el archivo de trabajo deben estar grabadas todas las líneas menos la última.
El archivo de partida debe seguir como al principio puesto que en él no se hace nada más que leer.
Si necesitas alguna otra aclaración dímelo.
No sé si probaste lo último que te dije. Si lo has probado cuéntame como te fue y si no lo has probado pruébalo cuando tengas un rato y me dices.
- Compartir respuesta