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:
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:
@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.
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:
For /F "UseBackQ Delims=" %%x in ("file.txt") do (
...
)
Saludos
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í:
@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.
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:
Echo. %%x
Muestra el contenido de 'file.txt'.
Saludos
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.
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.vbsInputFile = ".\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!
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.