eliminar filas vacias txt (con columnas)

Iniciado por choporrue, 17 Septiembre 2014, 09:40 AM

0 Miembros y 1 Visitante están viendo este tema.

choporrue

Buenos días,

Tengo varios ficheros txt en una carpeta con la siguiente estructura:

XXX  XX XXXXXX XX
XXX  XX XXXXXX XX
XXX  XX XXXXXX XX
XXX  XX XXXXXX XX


El caso es que los necesito unir. He hecho esto mediante un comando simple:

Código (dos) [Seleccionar]
Copy /B "*.txt" "file.txt"

El caso es que me junta los archivos pero me deja un monton de filas en blanco, que no necesito. Para ello he creado otro fichero batch (gracias grandísimo post de Leo Gutiérrez "acciones sobre archivos de texto) con el siguiente código:

Código (dos) [Seleccionar]
@echo off
echo Mi archivo con lineas en blanco :
type "file.txt"
for /f %%x in ('type "file.txt"') do (
echo %%x >> file2.txt
)
echo.
echo Mi archivo sin lineas en blanco :
type file2.txt


El resultado que me da en file2.txt es que efectivamente me quita las filas vacias, pero también se carga todas las columnas salvo la primera quedando el fichero asi:

XXX
XXX
XXX
XXX
etc.


¿Cómo puedo unir los ficheros con todos los datos? puedo hacer las dos fases (unir ficheros de una carpeta y eliminar las filas en blanco) con un solo batch ?

Muchas gracias y saludos.




Eleкtro

Cita de: choporrue en 17 Septiembre 2014, 09:40 AM¿Cómo puedo unir los ficheros con todos los datos?

El For solo está procesando la primera palabra de cada linea.

Modificalo de esta manera:

Código (dos) [Seleccionar]
For /F "UseBackQ Delims=" %%x in ("file.txt") do (
   ...
)


Saludos








choporrue

#2
Hola!

Ante todo, muchas gracias por la rápida respuesta.
He probado tu solución y en el fichero resultante (file2.txt), las filas que antes aparecían en blanco han sido sustituidas por la expresión "ECHO est  desactivado".

el código con tu retoque lo tengo así:

Código (dos) [Seleccionar]
@echo off
echo Mi archivo con lineas en blanco :
type "file.txt"
For /F "UseBackQ Delims=" %%x in ("file.txt") do (
echo %%x >> file2.txt
)
echo.
echo Mi archivo sin lineas en blanco :
type file2.txt




Muchas gracias de nuevo!


Saludos.



Eleкtro

#3
Cita de: choporrue en 17 Septiembre 2014, 11:42 AMHe probado tu solución y en el fichero resultante (file2.txt), las filas que antes aparecían en blanco han sido sustituidas por la expresión "ECHO est  desactivado".

Los parámetros que le añadi al For para corregirlo, toman la linea entera, y excluyen lineas en blanco.

Si no te funciona el código, quizás exista algun caracter ilegal en dichas filas, quizás hayan lineas que solo contengan espacios (eso no se considera una linea vacia), quizás la codificación del archivo no sea la apropiada, o quizás pueda ser causa de otro motivo.

Utiliza el punto en el comando Echo para imprimir lineas en blanco o con espacios:

Código (dos) [Seleccionar]
Echo. %%x

Muestra el contenido de 'file.txt'.

Saludos








choporrue

Gracias por tu respuesta de nuevo.

Me parece que, efectivamente, lo que ocurre es que hay líneas en blanco pero no vacias (contienen espacios).

Existe alguna forma de hacerlo?

Subo el archivo a Dropbox por si eso ayudase:

https://www.dropbox.com/s/ilu87uwip8i57fy/TEST.rar?dl=0

Gracias de nuevo por la ayuda!

Saludos.

Eleкtro

Cita de: choporrue en 17 Septiembre 2014, 16:09 PMExiste alguna forma de hacerlo?

Te diría que si, utilizando la expresión regular "^\s+" con el comando Findstr /V /R "expresión" en windows 7 debería funcionar, pero al parecer no me reconoce bien la expresión en Win8.1 (tengo el comando externo Findstr bugueado).

De todas formas, un RegEx sería un proceso muy lento para el pobre Batch, mejor te escribo un código equivalente en VbScript:

Script.vbs
Código (vb) [Seleccionar]
InputFile  = ".\File.txt"
OutputFile = ".\File2.txt"

Const ForReading = 1
Const ForWriting = 2

Set FSO = CreateObject("Scripting.FileSystemObject")
Set ReadFile = FSO.OpenTextFile(InputFile, ForReading)

Do Until ReadFile.AtEndOfStream

strLine = ReadFile.Readline
strLine = Trim(strLine)

If strLine <> "" Then
strNewContents = (strNewContents & strLine & vbNewLine)
End If

Loop : ReadFile.Close

Set ReadFile = FSO.OpenTextFile(OutputFile, ForWriting, True)
ReadFile.Write strNewContents
ReadFile.Close

wScript.Quit(0)


Si no te sirve y lo necesitas en Batch, comenta y te propondré soluciones alternativas (a un regex) en dicho lenguaje.

Saludos!








choporrue

Absolutamente brillante! 

El código en VBS funciona de lujo!

Ya para nota, podrá unir los ficheros y eliminar las filas en un solo proceso?

Enorme tu ayuda!

Saludos.