Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: desdemx en 23 Mayo 2012, 17:56 pm



Título: ayuda para hacer un batch
Publicado por: desdemx en 23 Mayo 2012, 17:56 pm
Hola, yo realmente no se hacer este tipo de archivos, solo los he usado alguna vez, pero tengo la necesidad de modificar mas de 800 archivos de texto y por ello pensé que seria mas fácil con un programa que haga una parte en automático.

Lo que necesito es lo siguiente:

Los archivos son de esta forma:

123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|

Pero yo los necesito de esta forma:

123|
456|
789|
012|
123|
456|
789|
012|
123|
456|
789|
012|

¿Es posible hacerlo con un batch? Si se puede ¿como puedo hacerlo?

De antemano muchas gracias.


Título: Re: ayuda para hacer un batch
Publicado por: Eleкtro en 23 Mayo 2012, 19:35 pm
Quizás no es el code más perfecto (Demasiado código), pero hace lo que pides.

Código
  1. @Echo OFF
  2.  
  3. :: Foro.ElHacker.Net
  4.  
  5. For /F "tokens=*" %%# in ('Dir /B "*.txt"') do (
  6. For /F "tokens=*" %%a in ('type "%%#"') do (
  7. Echo %%#: | MORE
  8. Set "String=000^|%%a"
  9. Set /A Next=2
  10. Call :Loop
  11. Echo __________________ | MORE
  12. )
  13. )
  14.  
  15.  
  16. :Loop
  17. For /F "tokens=%Next%,1,* delims=|" %%a in ('Echo "%STRING%"') do (
  18. Set /A "BLOCK=%%b" 2>NUL
  19. Echo %%b | FINDSTR "[0-9]"  || (Goto :EOF)
  20. Set /A Next+=1
  21. Call :Loop
  22. )

(http://img59.imageshack.us/img59/3002/prtscrcapturea.jpg)

PD: Otra forma seria usar un FOR + Un Contador, Para ir mostrando cada bloque en 4x4 caracteres del texto.
Código
  1. Echo %Var:~4,4%
  2. Echo %Var:~8,4%
  3. Echo %Var:~12,4%
  4. Etc...

Saludos.


Título: Re: ayuda para hacer un batch
Publicado por: desdemx en 23 Mayo 2012, 20:08 pm
Muchas gracias.

Si funciona  :D, pero tengo algunos segmentos que son de mas de 3 numero y otros de menos incluso hay unos donde están los pipes juntos, ¿existe la posibilidad de que lo haga sin que tome en cuenta la cantidad de caracteres que hay entre cada pipe?

Y por otra parte también requiero que queden los pipes al final de cada segmento.

Por ejemplo de esta forma:

123|
45|
67890|
|
|
1|

Te agradezco mucho nuevamente.


Título: Re: ayuda para hacer un batch
Publicado por: Eleкtro en 23 Mayo 2012, 20:16 pm
Si, un contador para mostrar solo los números... cuando tenga un rato lo hago si no se me adelanta alguien.

salu2


Título: Re: ayuda para hacer un batch
Publicado por: desdemx en 23 Mayo 2012, 20:20 pm
Te lo agradezco mucho.


Título: Re: ayuda para hacer un batch
Publicado por: Runex en 23 Mayo 2012, 21:03 pm
Si quieres te lo puedo hacer en python, espero tu respuesta y mañana en 5 minutos cuando venga del instituto lo tienes :D


Título: Re: ayuda para hacer un batch
Publicado por: desdemx en 23 Mayo 2012, 21:49 pm
Muchas gracias, no se cual o si haya algún inconveniente para ejecutarlo y que me funcione.

Y por otra parte estuve revisando mas archivos y en algunos también hay texto, así que no solo son segmentos de puros numero, sino en algunos están combinados.

De nuevo muchas gracias.


Título: Re: ayuda para hacer un batch
Publicado por: Eleкtro en 24 Mayo 2012, 09:41 am
en algunos también hay texto, así que no solo son segmentos de puros numero, sino en algunos están combinados.

El siguiente código separa los bloques cuando encuentra el caracter "|", Así que es independiente de si son números o texto... pero si algún bloque contiene un espacio, es posible que de error.

Código:
@Echo OFF

:: editado, versión 2 del code
:: Foro.ElHacker.Net

setlocal enabledelayedexpansion

For /F "tokens=*" %%# in ('Dir /B "*.txt" ^| FIND /V "NUEVO"') do (
For /F "tokens=*" %%a in ('type "%%#"') do (
Set /A Next=0
Echo %%#:
Echo __________________ | MORE
Set "String=%%a"
ECHO !String!> "%TEMP%\temp.txt"
FOR %%? IN (%TEMP%\temp.txt) DO (SET /A longitud=%%~z? - 2)
Call :Loop
Echo+
)
)
Goto :FIN
 
:Loop
For /F "tokens=*" %%a in ('Echo "%STRING%"') do (
Set /A Next+=1
If !NEXT! GTR %LONGITUD% (Goto :EOF)
Echo "!STRING:~%NEXT%,1!" | FINDSTR "|" >NUL
If !Errorlevel! EQU 1 (
Set "BLOCK=!BLOCK!!STRING:~%NEXT%,1!"
) ELSE (
If Defined BLOCK (Echo !BLOCK:^|=!^| & Echo !BLOCK:^|=!^|>>"%%~n#_NUEVO.txt")
Set "BLOCK=!STRING:~%NEXT%,1!"
)
Call :Loop
)
Goto :EOF


:FIN
Pause
Exit

EDIT:
(http://img27.imageshack.us/img27/7121/prtscrcapturecb.jpg)

PD: Joder, lo facil que seria hacer esto en ruby con un "split" o en python xD

Saludos


Título: Re: ayuda para hacer un batch
Publicado por: orvtech en 24 Mayo 2012, 13:48 pm
Hola, yo realmente no se hacer este tipo de archivos, solo los he usado alguna vez, pero tengo la necesidad de modificar mas de 800 archivos de texto y por ello pensé que seria mas fácil con un programa que haga una parte en automático.

Lo que necesito es lo siguiente:

Los archivos son de esta forma:

123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|123|456|789|012|345|

Pero yo los necesito de esta forma:

123|
456|
789|
012|
123|
456|
789|
012|
123|
456|
789|
012|

¿Es posible hacerlo con un batch? Si se puede ¿como puedo hacerlo?

De antemano muchas gracias.
adapta esto a un loop:
Código:
cat archivo-test.txt | tr '|' '\n' | awk '{print $0"|"}'

Podria ser:
Código:
for archivos in `ls *.txt`
do cat $archivos |tr '|' '\n' | awk '{print $0"|"}'
done


UPDATE: Sorry, recién acabo de leer bien el titulo del post y lo que piden es un batch, no un bash  :huh:


Título: Re: ayuda para hacer un batch
Publicado por: Runex en 24 Mayo 2012, 14:11 pm
Una solución rápida en python pero funcional :)

(http://i48.tinypic.com/zofoy.png)
Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. archivo,lista,acumulador = (open("archivox.txt","r"),[],"")
  4. for letra in archivo.read():
  5. if letra != "|":
  6. acumulador = acumulador + letra
  7. else:
  8. lista.append(acumulador)
  9. acumulador = ""
  10. for elemento in lista:
  11. print elemento + "|"
  12. archivo.close()
  13.  

Y ésta sería otra alternativa haciendo uso de split, como dice mi compañero Elektro

Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import string
  4. archivo = open("archivox.txt","r")
  5. lista = archivo.read().split("|")
  6. for elemento in lista:
  7. print elemento.replace("\n","") + "|"
  8. archivo.close()
  9.  

En ambas debes cambiar "archivox.txt" por el nombre de tu archivo :)

Un saludo, Runex.


Título: Re: ayuda para hacer un batch
Publicado por: Eleкtro en 24 Mayo 2012, 15:13 pm
Y ésta sería otra alternativa haciendo uso de split, como dice mi compañero Elektro
Código
  1. lista = archivo.read().split("|")

Maldita séa, De verdad que me da mucha rabia que Batch no tenga algo así... No creo que séa tan dificil de integrar una funcion de "split" por parte de Microsoft...

Bueno, Aquí lo dejo en Ruby, Ya que estamos:

Código
  1. # -*- coding: UTF-8 -*-
  2.  
  3. archivo = 'archivo.txt'
  4. File.open(archivo, "r").each_line { |bloque|
  5. puts bloque.split('|')
  6. }

Saludos


Título: Re: ayuda para hacer un batch
Publicado por: desdemx en 24 Mayo 2012, 16:37 pm
WOW  ;D Muchas gracias EleKtro, si funciona a pesar de los espacios, pero el problema es que solo pasa hasta 99 líneas, ¿hay forma de hacer que haga mas? Porque lo mínimo son 310, pero hay unas que tienen mas de 1000



Muchas gracias Runex  ;D , pero perdona mi ignorancia, ¿estos con que extensión los guardo y que programa debo de tener para poder ejecutarlos?

Y si que se nota la diferencia entre la programación entre uno y otro, es bastante menos.



orvtech de cualquier forma te agradezco mucho.

Saludos.


Elektro H@cker: No hacer doble (Ni triple...)  post, usa el botón "Modificar"


Título: Re: ayuda para hacer un batch
Publicado por: Eleкtro en 24 Mayo 2012, 16:47 pm
¿estos con que extensión los guardo y que programa debo de tener para poder ejecutarlos?

Si quieres usar el code de Runex, El archivo se guarda como ARCHIVO.PY, Y necesitas Python.
http://www.python.org/download/

Si quieres usar el último code que puse, El archivo se guarda como ARCHIVO.RB, Y necesitas Ruby...
http://www.ruby-lang.org/es/downloads/

El código en Batch seguramente te esté dando problemas por el límite de recursividad (Demasiadas llamadas "CALL") Intentaré arreglarlo a ver...

EDITO: ¿Es este el error que te da?

Código:
******  RECURSIÓN DE ARCHIVO POR LOTES supera los límites de la PILA ******
Recuento de recursiones=302,Uso de la pila=90 por ciento
******     SE ANULA  EL PRECESAMIENTO DEL ARCHIVO POR LOTES       ******

Saludos


Título: Re: ayuda para hacer un batch
Publicado por: desdemx en 24 Mayo 2012, 16:53 pm
Gracias de nuevo  ;D , voy a probar con los oros 2 que me hicieron favor de hacer.

En verdad agradezco mucho el tiempo que invierten en ayudarme.  :laugh:  ;-)

Saludos.  



En cuanto al error, no veo cual solo se cierra, pero lo probé con varios archivos y todos terminan en la línea 99.

Saludos.



Si quieres usar el code de Runex, El archivo se guarda como ARCHIVO.PY, Y necesitas Python.
http://www.python.org/download/

Si quieres usar el último code que puse, El archivo se guarda como ARCHIVO.RB, Y necesitas Ruby...
http://www.ruby-lang.org/es/downloads/

El código en Batch seguramente te esté dando problemas por el límite de recursividad (Demasiadas llamadas "CALL") Intentaré arreglarlo a ver...

EDITO: ¿Es este el error que te da?

Código:
******  RECURSIÓN DE ARCHIVO POR LOTES supera los límites de la PILA ******
Recuento de recursiones=302,Uso de la pila=90 por ciento
******     SE ANULA  EL PRECESAMIENTO DEL ARCHIVO POR LOTES       ******

Saludos

Ya descargue los programas para usar los otros archivos, y los guarde con las extensiones que me dijiste y el de Ruby si alcanzo a ver que hace algo, pero la ventana se cierra muy rápido. El de Python es aun más rápido.

No se si estoy haciendo algo mal, ¿me puedes decir por favor como debo ejecutarlos para obtener el resultado?  :huh:

Gracias.

Saludos.

Elektro H@cker: No hacer doble  post, usa el botón "Modificar"


Título: Re: ayuda para hacer un batch
Publicado por: Eleкtro en 24 Mayo 2012, 17:36 pm
desdemx.rb

Código
  1. # Pon este código en la carpeta donde tengas los archivos de texto que quieras listar en vertical...
  2. # Este código creará un nuevo archivo con el mismo nombre de cada texto que se vaya procesando...
  3. # Ejemplo: archivo1.txt < > archivo1_NUEVO.txt
  4.  
  5. for file in Dir.glob("*.{txt}") do
  6. puts "[+] #{file}:\n\n"
  7. File.open(file[0..-5] + "_Nuevo.txt", 'a+') do |newfile|
  8. File.open(file, "r").each_line { |bloque|
  9. puts bloque.gsub('|', '|elektro;').split('elektro;'), "\n"
  10. newfile.puts bloque.gsub('|', '|elektro;').split('elektro;'), "\n"
  11. }
  12. end # arrays
  13. end # for
  14.  
  15. print '
  16. Proceso finalizado.
  17. Gracias por usar!
  18.  
  19. Elektro H@cker
  20. Foro.ElHacker.Net
  21. '
  22. sleep 8

Te lo dejo convertido a .exe, así no tienes que descargar ruby ni python:
http://www.mediafire.com/?8la94w50ct1i780

(http://img135.imageshack.us/img135/1108/prtscrcaptureid.jpg)

Saludos.

PD: Repito, No hagas doble y mucho menos TRIPLE post... :-/ el proximo doble post lo elimino.


Título: Re: ayuda para hacer un batch
Publicado por: desdemx en 24 Mayo 2012, 18:06 pm
Perdón por lo de los post. :-[

Muchisimas gracias  ;D ya funciona como lo quiero ;-)

Saludos.


Título: Re: ayuda para hacer un batch
Publicado por: Runex en 24 Mayo 2012, 18:55 pm
Se cierra rápido ya que no puse ningún bloqueo una vez finalizada la secuencia del programa, con un simple raw_input() se hubiera solucionado :).

Me alegro de que hayas conseguido lo que necesitabas, cualquier cosa, ya sabes :)

Un saludo, Runex


Título: Re: ayuda para hacer un batch
Publicado por: desdemx en 24 Mayo 2012, 20:33 pm
Runex pues te agradezco mucho el tiempo que le dedicaste  ;D y mas gracias  por ofrecer tu ayuda ;D.

Saludos.