Acciones sobre archivos de texto. [Batch]

Iniciado por leogtz, 24 Enero 2009, 00:30 AM

0 Miembros y 2 Visitantes están viendo este tema.

javiert239

Yo tengo una consulta.
Tengo dos archivos, archivo1.txt y archivo2.txt.
El arhivo1 contiene lo siguiente:
Citar
Primera linea

Tercera linea

Quinta linea
El archivo2 contiene lo siguiente:
Citar

Segunda linea

Cuarta linea

Existe alguna forma de fucionar esos archivos de forma que las lineas queden en sus lugares correspondietes? Parecia algo bastante sencillo, pero el otro dia le di un millon de vueltas y no encotre ninguna forma.

Eleкtro

#321
Cita de: javiert239 en 20 Junio 2015, 20:57 PMExiste alguna forma de fucionar esos archivos de forma que las lineas queden en sus lugares correspondietes? Parecia algo bastante sencillo, pero el otro dia le di un millon de vueltas y no encotre ninguna forma.

En Batch sería algo MUY, MUY tedioso (e ineficiente) ya que no tiene soporte para Arrays; En cualquier otro lenguaje de verdad, sería algo muy sencillo.

Una manera general de llevar a cabo esa tarea sería iterar con un búcle las lineas de texto del primer archivo para añadir esas lineas a un Array, una vez hecho esto, ya tienes una colección indizada en la que poder comprobar si un elemento está vacío o no, para reemplazarlo/fusionarlo por el elemento con el mismo índice al iterar las lineas del segundo archivo.

Pseudo-Código:

declare linesCol(Array) = Null
declare mixedLinesCol(Array) = Null
declare index(Int32) = 0

For Each line(String) in textfile1.ReadToEnd:
   linesCol1(Index) = line
   Index += 1
End For

Index = 0 # Resetear el contador.
For each line(String) in textfile2.ReadToEnd:

   # Si la linea no está vacía, reemplazar por la linea original (o añadirla).
   if line.IsNotEmpty() Then
       linesCol1(Index) = line
   End If

   Index += 1
End For





Se que no es Batch, pero desarrollarlo en Batch sería perder el tiempo por que hay muchas mejores opciones, prefiero aportarte una alternativa mejor, mostrándote este código funcional (y eficiente) desarrollado en VB.NET:
Código (vbnet) [Seleccionar]
Dim textLineCol1 As IEnumerable(Of String) =
   File.ReadAllLines("Archivo 1.txt", Encoding.Default)

Dim textLineCol2 As IEnumerable(Of String) =
   File.ReadAllLines("Archivo 2.txt", Encoding.Default)

Dim mixedLineCol As New List(Of String)

For index As Integer = 0 To (textLineCol2.Count - 1)

   Dim curLine As String = textLineCol2(index)

   If (textLineCol1.Count <= index) OrElse (Not String.IsNullOrWhiteSpace(curLine)) Then
       mixedLineCol.Add(curLine)

   Else
       mixedLineCol.Add(textLineCol1(index))

   End If

Next index

File.WriteAllLines("Fusionado.txt", mixedLineCol, Encoding.Default)


Archivo 1.txt:
Código (ini) [Seleccionar]
Linea1

Linea 3

Linea 5


Archivo 2.txt:
Código (ini) [Seleccionar]

Linea 2

Linea 4
Linea5 - Nueva
Linea 6


Archivo Combinado.txt:
Código (ini) [Seleccionar]
Linea1
Linea 2
Linea 3
Linea 4
Linea5 - Nueva
Linea 6


Saludos!








javiert239

Muchas gracias, eso era exactamente lo que queria hacer. Lo probe y funciono sin ningun problema. Muchas gracias de nuevo.

DonnySantiago

Hola buen dìa,

Soy nuevo en esto , tengo un archivo .txt que tiene cierto contenido xml , como por ejemplo :
<nombre> Donny </nombre>
Pero hay casos que este archivo contiene etiquetas de contenido vacio como por ejemplo:
<Numero> </numero>
Mi duda es la siguiente , como harìa para eliminar esas etiquetas de contenido vacio, claro esta que esas etiquetas pueden varias no solo serà <Numero></Numero> , sino tambien aparecerán etiquetas como <Direccion></Direccion> que también tendrán contenido vacio , esto lo puedo hacer con archivo batch ?

nyoz

Buenas tardes,

tengo el siguiente código:

@echo off
del contador.log

FOR %%F IN (lis0*.txt) DO (
set /a contador=0
for /f "tokens=*" %%_ in (%%F) do (
set /a contador+=1
)
echo %%F>>contador.log
call :imprimir
)

:imprimir
echo %contador%>>contador.log


El código funciona para contar la cantidad de filas de un archivo de texto con la estructura: lis0*.txt, pero necesito ejecutarlo en un árbol de carpetas para todos los archivos con esa estructura, no sólo en la carpeta donde se ejecuta el bat.

Adicional, el log que sale es de la siguiente manera:

Citarlis001_100_20150903.txt
29366
lis003_100_20150903.txt
366
lis004_100_20150903.txt
66
lis013_100_20150903.txt
293
293

Donde se repite el último número (no debería) o al menos así debería quedar el log:

Citarlis001_100_20150903.txt|29366
lis003_100_20150903.txt|366
lis004_100_20150903.txt|66
lis013_100_20150903.txt|293

Desde ya les agradezco la colaboración.

Eleкtro

#325
Cita de: nyoz en  3 Septiembre 2015, 20:59 PMEl código funciona para contar la cantidad de filas de un archivo de texto con la estructura: lis0*.txt, pero necesito ejecutarlo en un árbol de carpetas para todos los archivos con esa estructura, no sólo en la carpeta donde se ejecuta el bat.

Entonces utiliza un For /R.




Cita de: nyoz en  3 Septiembre 2015, 20:59 PMAdicional,

Donde se repite el último número (no debería)

Puedes utilizar el comando FIND para contar lineas.

Aquí tienes el código funcional:
Código (dos) [Seleccionar]
@Echo Off & Setlocal EnableDelayedExpansion

Set "filePattern=lis0*.txt"
Set "logfile=.\Contador.log"

(FOR /R %%F IN ("%filePattern%") DO (
   For /F %%v in ('Find /V /C "" ^< "%%~fF"') Do (Set /A "count=%%v")
Echo %%~nxF^|!count!
))>"%logfile%"

Type "%logfile%"

Pause&Exit /B 0


Saludos!








layra

 :silbar: Como puedo extraer información de una base de datos de SQl serve 2008 con un archivo batch -- por favor ayudenmeeeeee siiiiiii  :-(  :-(

elqueteconte

Saludos;

He heredado el siguiente script:

copy /y blancos\*.TXT .

copy CM.txt + C:\carp1\Emp1\20150908\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150908\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150908\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150908\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150908\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150908\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150909\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150909\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150909\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150909\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150909\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150909\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150910\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150910\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150910\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150910\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150910\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150910\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150911\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150911\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150911\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150911\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150911\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150911\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150912\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150912\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150912\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150912\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150912\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150912\IMP6003.txt IMP6003.txt

Como pueden ver la variable "carp1"; "Emp1" son constantes pero la carpeta siguiente corresponde a los días del mes.

La idea es como hago para que cuando ejecuto el script le pase por parámetro el nombre de la Empresa y haga un recorrido por las carpetas que y vaya haciendo la copia hasta que consiga la ultima carpeta.

Desde ya mil gracias....

sorry

Buenas!!

No se si es posible, a ver que me contáis.

Me gustaría añadir el texto de un documento a otro en una zona concreta, después de una palabra para ser exactos.

Esto es posible?

Muchas gracias

Eleкtro

#329
Cita de: sorry en 23 Octubre 2015, 12:30 PMañadir el texto de un documento a otro en una zona concreta, después de una palabra para ser exactos.

Se puede llevar a cabo, pero sería demasiado tedioso de conseguir y el resultado sería un código demasiado sucio e ineficiente. Esa tarea es algo muy complejo para un lenguaje limitado como es Batch.

El primer problema que se me ocurre es que tendrías que idear un tedioso algoritmo que iterarase todos los caracteres del archivo objetivo delimitándolo por el caracter espacio " " para poder identificar palabras hasta encontrar la palabra donde quieres insertar texto... sería como reinventar la rueda.

En este script que desarrollé hace tiempo, puedes encontrar algunos ejemplos de manipulación de texto, los cuales de por si ya son un lio.
[BATCH] [APORTE] Rutina TEXTMAN para manipular archivos de texto

No vale la pena el esfuerzo, ya te aviso. Tu mejor opción es usar un lenguaje apto.

En VBS podrías utilizar el método "Split" para partir el texto en dos según la palabra especificada, o también podrías utilizar una expresión regular para obtener la palabra y su posición.

En otros lenguajes más sofisticados como por ejemplo VB.Net/C# (solo por nombrar a los que estoy acostumbrado) sería mucho más sencillo, podrías utilizar las metodologías mencionados plus la función "String.IndexOf" y muchas otras más formas de llevarlo a cabo.

Saludos