elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  ayuda con renombrado de archivo txt em batch
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con renombrado de archivo txt em batch  (Leído 2,201 veces)
eltioted

Desconectado Desconectado

Mensajes: 3


Ver Perfil
ayuda con renombrado de archivo txt em batch
« en: 29 Junio 2015, 22:10 pm »

Hola como estan todos? tengo un inconveniente, recién me inicio en esto y en el trabajo me solicitaron hacer algo asi, es un listado como el que te muestro con otros datos similares pero el esquema sería el mismo:
 
TRANSACCION 1
TRANSACCION 2
TRANSACCION 3
TRANSACCION 4
TRANSACCION 5
TRANSACCION 6
TRANSACCION 7
TOTALES DE LA TERMINAL 02602  :
TRANSACCION 8
TRANSACCION 9
TRANSACCION 10
TRANSACCION 11
TRANSACCION 12
TRANSACCION 13
TRANSACCION 14
TOTALES DE LA TERMINAL 02603  :
TRANSACCION 15
TRANSACCION 16
TRANSACCION 17
TRANSACCION 18
TRANSACCION 19
TRANSACCION 20
TRANSACCION 21
TOTALES DE LA TERMINAL 02606  :
TRANSACCION 22
TRANSACCION 23
TRANSACCION 24
TRANSACCION 25
TRANSACCION 26
TRANSACCION 27
TRANSACCION 28
TOTALES DE LA TERMINAL 02620  :
 
 
bueno lo que yo necesito es que me figure el listado de la siguiente manera luego de pasarlo por el .bat.
 
TOTALES DE LA TERMINAL 02602  :TRANSACCION 1
TOTALES DE LA TERMINAL 02602  :TRANSACCION 2
TOTALES DE LA TERMINAL 02602  :TRANSACCION 3
TOTALES DE LA TERMINAL 02602  :TRANSACCION 4
TOTALES DE LA TERMINAL 02602  :TRANSACCION 5
TOTALES DE LA TERMINAL 02602  :TRANSACCION 6
TOTALES DE LA TERMINAL 02602  :TRANSACCION 7
TOTALES DE LA TERMINAL 02602  :TOTALES DE LA TERMINAL 02602  :
TOTALES DE LA TERMINAL 02603  :TRANSACCION 8
TOTALES DE LA TERMINAL 02603  :TRANSACCION 9
TOTALES DE LA TERMINAL 02603  :TRANSACCION 10
TOTALES DE LA TERMINAL 02603  :TRANSACCION 11
TOTALES DE LA TERMINAL 02603  :TRANSACCION 12
TOTALES DE LA TERMINAL 02603  :TRANSACCION 13
TOTALES DE LA TERMINAL 02603  :TRANSACCION 14
TOTALES DE LA TERMINAL 02603  :TOTALES DE LA TERMINAL 02603  :
TOTALES DE LA TERMINAL 02606  : TRANSACCION 15
TOTALES DE LA TERMINAL 02606  : TRANSACCION 16
TOTALES DE LA TERMINAL 02606  : TRANSACCION 17
TOTALES DE LA TERMINAL 02606  : TRANSACCION 18
TOTALES DE LA TERMINAL 02606  : TRANSACCION 19
TOTALES DE LA TERMINAL 02606  : TRANSACCION 20
TOTALES DE LA TERMINAL 02606  : TRANSACCION 21
TOTALES DE LA TERMINAL 02606  : TOTALES DE LA TERMINAL 02606  :
TOTALES DE LA TERMINAL 02620  : TRANSACCION 22
TOTALES DE LA TERMINAL 02620  : TRANSACCION 23
TOTALES DE LA TERMINAL 02620  : TRANSACCION 24
TOTALES DE LA TERMINAL 02620  : TRANSACCION 25
TOTALES DE LA TERMINAL 02620  : TRANSACCION 26
TOTALES DE LA TERMINAL 02620  : TRANSACCION 27
TOTALES DE LA TERMINAL 02620  : TRANSACCION 28
TOTALES DE LA TERMINAL 02620  : TOTALES DE LA TERMINAL 02620  :
 
La manera que encuentro es la siguiente, primero paso el archivo MADRE (sin formato) le hago un find de la palabra “TOTALES DE LA TERMINAL” y el resultado me lo guardo en un FINTERMINAL.txt.
Una vez hecho eso hago lo siguiente:
Recorro con un FOR todo el archivo madre comparando el registro con una variable (esta variable la voy a sacar del archivo FINTERMINAL.txt), si la variable es igual al registro del archivo MADRE, hago que cambie de variable del archivo FINTERMINAL.txt
 
Este es el código que hice, pero queda en loop, algo estoy haciendo mal, si pueden ayudarme sería genial.
 
 
Código
  1. @ECHO OFF
  2. :leer
  3. find /i "TOTALES DE LA TERMINAL " d:\MADRE.txt >D:/FINTERMINAL.txt
  4. for /f "skip=2 tokens=* delims= " %%b in (d:\FINTERMINAL.txt) do ((for /f "tokens=* delims= " %%a in (d:\MADRE.txt) do (if %%a EQU %%b (goto leer) else ((echo %%b%%a) ::>>RESULTADO.txt))))
  5.  
Tengo que leer el archivo madre, comparar el registro del archivo madre con el registro que lei del archivo de finterminal, si es distinto, en un nuevo archivo agregar el registro de finterminal + el registro del archivo madre, si el registro del madre con el de terminal fuesen igual, debería de seguir leyendo el archivo findeterminal para pasar a la siguiente terminal, y seguir leyendo el archivo madre desde la posicion donde estaban.

desde ya muchas gracias a todos! espero me puedan ayudar! saludos.


« Última modificación: 29 Junio 2015, 23:50 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: ayuda con renombrado de archivo txt em batch
« Respuesta #1 en: 30 Junio 2015, 00:19 am »

Antes de nada:

Está prohibido el doble post.



En Batch, al ser un lenguaje tan limitado, se convierte en algo más complejo (o mejor dicho, TEDIOSO) que lo que estás haciendo.

Te he escrito el siguiente ejemplo funcional.

Cabe mencionar que el procesado del texto es lento (muy lento) ya que el texto se itera dos veces, la primera iteración es para obtener las lineas "TOTALES DE LA TERMINAL XXXXX  :", y en la segunda iteración, para formatear la salida del texto, cada linea debe pasar por la entrada de la aplicación "Find.exe" (dos veces) para acondicionar el formato, entonces, la constante ejecución de Find.exe lo vuelve lento;
Con pequeños archivos no pasa nada, pero si son archivos de miles de lineas entonces notarás que puede llegar a tardar minuto(s) (más si activases el echo en esa iteración, en lugar de redirigir la salida al archivo).

Es algo irremediable. En cualquier otro lenguaje esta tarea sería algo mucho más eficiente.

Código
  1. @Echo OFF & Title Plantilla Batch por defecto by Elektro
  2.  
  3. Setlocal EnableDelayedExpansion
  4.  
  5. Set "sourceTextFile=%CD%\1.txt"
  6. Set "targetTextFile=%CD%\New.txt"
  7.  
  8. :: Crear una variable dinámicada por cada linea "TOTALES DE LA TERMINAL XXXXX  :"" encontrada.
  9. For /F "Tokens=* Delims=" %%a In ('Type "%sourceTextFile%" ^| Find /I "Totales"') Do (
  10. Set /A "matchIndex += 1"
  11. Set "var!matchIndex!=%%~a"
  12. )
  13.  
  14. :: Iterar las lineas del archivo.
  15. Set /A "varIndex += 1"
  16. (For /F "UseBackQ Tokens=* Delims=" %%a In ("%sourceTextFile%") Do (
  17.  
  18. (Echo "%%~a" | Find /I "TOTALES DE LA TERMINAL")1>NUL 2>&1 && (
  19. Set /A "varIndex += 1"
  20. )
  21.  
  22.    REM Elimina esta condicioón si quieres que también se escriban lineas cómo esta:
  23.    REM TOTALES DE LA TERMINAL 02602  :TOTALES DE LA TERMINAL 02602  :
  24. (Echo "%%~a" | Find /I "TRANSACCION")1>NUL 2>&1 && (
  25. Call Echo %%var!varIndex!%%%%~a
  26. )
  27.  
  28. ))>"%targetTextFile%"
  29.  
  30. Pause&Exit /B 0

Resultado de ejecución:
Código:
TOTALES DE LA TERMINAL 02602  :TRANSACCION 1
TOTALES DE LA TERMINAL 02602  :TRANSACCION 2
TOTALES DE LA TERMINAL 02602  :TRANSACCION 3
TOTALES DE LA TERMINAL 02602  :TRANSACCION 4
TOTALES DE LA TERMINAL 02602  :TRANSACCION 5
TOTALES DE LA TERMINAL 02602  :TRANSACCION 6
TOTALES DE LA TERMINAL 02602  :TRANSACCION 7
TOTALES DE LA TERMINAL 02603  :TRANSACCION 8
TOTALES DE LA TERMINAL 02603  :TRANSACCION 9
TOTALES DE LA TERMINAL 02603  :TRANSACCION 10
TOTALES DE LA TERMINAL 02603  :TRANSACCION 11
TOTALES DE LA TERMINAL 02603  :TRANSACCION 12
TOTALES DE LA TERMINAL 02603  :TRANSACCION 13
TOTALES DE LA TERMINAL 02603  :TRANSACCION 14
TOTALES DE LA TERMINAL 02606  :TRANSACCION 15
TOTALES DE LA TERMINAL 02606  :TRANSACCION 16
TOTALES DE LA TERMINAL 02606  :TRANSACCION 17
TOTALES DE LA TERMINAL 02606  :TRANSACCION 18
TOTALES DE LA TERMINAL 02606  :TRANSACCION 19
TOTALES DE LA TERMINAL 02606  :TRANSACCION 20
TOTALES DE LA TERMINAL 02606  :TRANSACCION 21
TOTALES DE LA TERMINAL 02620  :TRANSACCION 22
TOTALES DE LA TERMINAL 02620  :TRANSACCION 23
TOTALES DE LA TERMINAL 02620  :TRANSACCION 24
TOTALES DE LA TERMINAL 02620  :TRANSACCION 25
TOTALES DE LA TERMINAL 02620  :TRANSACCION 26
TOTALES DE LA TERMINAL 02620  :TRANSACCION 27
TOTALES DE LA TERMINAL 02620  :TRANSACCION 28

Saludos!


« Última modificación: 30 Junio 2015, 00:27 am por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines