ayuda para hacer un batch

Iniciado por desdemx, 23 Mayo 2012, 17:56 PM

0 Miembros y 1 Visitante están viendo este tema.

desdemx

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.

Eleкtro

#1
Quizás no es el code más perfecto (Demasiado código), pero hace lo que pides.

Código (dos) [Seleccionar]
@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
)




PD: Otra forma seria usar un FOR + Un Contador, Para ir mostrando cada bloque en 4x4 caracteres del texto.
Código (dos) [Seleccionar]
Echo %Var:~4,4%
Echo %Var:~8,4%
Echo %Var:~12,4%
Etc...


Saludos.








desdemx

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.

Eleкtro

Si, un contador para mostrar solo los números... cuando tenga un rato lo hago si no se me adelanta alguien.

salu2








desdemx


Runex

Si quieres te lo puedo hacer en python, espero tu respuesta y mañana en 5 minutos cuando venga del instituto lo tienes :D
"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".

desdemx

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.

Eleкtro

#7
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:


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

Saludos








orvtech

#8
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:

Runex

#9
Una solución rápida en python pero funcional :)


Código (python) [Seleccionar]
#!/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

Código (python) [Seleccionar]
#!/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.
"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".