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.
Quizás no es el code más perfecto (Demasiado código), pero hace lo que pides.
@Echo OFF
:: Foro.ElHacker.Net
For /F "tokens=*" %%# in ('Dir /B "*.txt"') do (
For /F "tokens=*" %%a in ('type "%%#"') do (
Echo %%#: | MORE
Set "String=000^|%%a"
Set /A Next=2
Call :Loop
Echo __________________ | MORE
)
)
Pause
Exit
:Loop
For /F "tokens=%Next%,1,* delims=|" %%a in ('Echo "%STRING%"') do (
Set /A "BLOCK=%%b" 2>NUL
Echo %%b | FINDSTR "[0-9]" || (Goto :EOF)
Set /A Next+=1
Call :Loop
)
(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.
Echo %Var:~4,4%
Echo %Var:~8,4%
Echo %Var:~12,4%
Etc...
Saludos.
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.
Si, un contador para mostrar solo los números... cuando tenga un rato lo hago si no se me adelanta alguien.
salu2
Te lo agradezco mucho.
Si quieres te lo puedo hacer en python, espero tu respuesta y mañana en 5 minutos cuando venga del instituto lo tienes :D
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.
Cita de: desdemx en 23 Mayo 2012, 21:49 PMen 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.
@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
Cita de: 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.
adapta esto a un loop:
cat archivo-test.txt | tr '|' '\n' | awk '{print $0"|"}'
Podria ser:
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:
Una solución rápida en python pero funcional :)
(http://i48.tinypic.com/zofoy.png)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
archivo,lista,acumulador = (open("archivox.txt","r"),[],"")
for letra in archivo.read():
if letra != "|":
acumulador = acumulador + letra
else:
lista.append(acumulador)
acumulador = ""
for elemento in lista:
print elemento + "|"
archivo.close()
Y ésta sería otra alternativa haciendo uso de split, como dice mi compañero Elektro
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import string
archivo = open("archivox.txt","r")
lista = archivo.read().split("|")
for elemento in lista:
print elemento.replace("\n","") + "|"
archivo.close()
En ambas debes cambiar "archivox.txt" por el nombre de tu archivo :)
Un saludo, Runex.
Cita de: Runex en 24 Mayo 2012, 14:11 PM
Y ésta sería otra alternativa haciendo uso de split, como dice mi compañero Elektro
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:
# -*- coding: UTF-8 -*-
archivo = 'archivo.txt'
File.open(archivo, "r").each_line { |bloque|
puts bloque.split('|')
}
Saludos
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"
Cita de: desdemx en 24 Mayo 2012, 16:40 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?
****** 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
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.
Cita de: EleKtro H@cker en 24 Mayo 2012, 16:47 PM
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?
****** 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"
desdemx.rb
# Pon este código en la carpeta donde tengas los archivos de texto que quieras listar en vertical...
# Este código creará un nuevo archivo con el mismo nombre de cada texto que se vaya procesando...
# Ejemplo: archivo1.txt < > archivo1_NUEVO.txt
for file in Dir.glob("*.{txt}") do
puts "[+] #{file}:\n\n"
File.open(file[0..-5] + "_Nuevo.txt", 'a+') do |newfile|
File.open(file, "r").each_line { |bloque|
puts bloque.gsub('|', '|elektro;').split('elektro;'), "\n"
newfile.puts bloque.gsub('|', '|elektro;').split('elektro;'), "\n"
}
end # arrays
end # for
print '
Proceso finalizado.
Gracias por usar!
Elektro H@cker
Foro.ElHacker.Net
'
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.
Perdón por lo de los post. :-[
Muchisimas gracias ;D ya funciona como lo quiero ;-)
Saludos.
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
Runex pues te agradezco mucho el tiempo que le dedicaste ;D y mas gracias por ofrecer tu ayuda ;D.
Saludos.