[Batch] Crear varios txt a partir de otro txt [Solucionado]

Iniciado por bjeli1980, 13 Abril 2010, 17:34 PM

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

bjeli1980

Hola,

A ver si alguien me puede echar una mano que estoy bastante atascado.

Quiero generar varios txt a partir de un txt. El fichero origen es asi:

La primera línea es el nombre del fichero, y tiene que generar un fichero hasta que encuentra la línea FIN MATERIAL.


1-1958.ad
Melamina Blanca1801958BK1X11-BK                     22/03/2010
1901958BK1X2001120004000000060Costado Armario 1100006
1901958BK1X2000752004485000010Puerta Armario 80500001
1901958BK1X2001482004485000100Puerta Armario A1 00010
1901958BK1X2000391505240000950Tapa-Fondo A1 basi00095
1801958BK1X4003660020500999990Melamina Blanca 3699999
FIN MATERIAL
1-1959.ad
Melamima Blanca1001959BK1X11-BK                     22/03/2010
1001959BK1X2000865003790000010Division Horizonta00001
1001959BK1X2001455008750000200Trasera 1535 A1 ba00020
1001959BK1X2001810008750000250Trasera 1900 A1 BA00025
1001959BK1X2000715008750000200Trasera 805 A1 BAS00020
1001959BK1X4003660020500999990Melamima Blanca 3699999
FIN MATERIAL
1-24507.ad
Blanco Super So25024507BK111-BK                     22/03/2010
25024507BK12000864003590000040Balda A1 basica00004
25024507BK14002550021000999990Blanco Super Soft 99999
FIN MATERIAL


Yo he hecho este script pero me da un error de "No se esperaba ( en este momento.".

::CrearFichero por Materiales partiendo de "listacorteoptimizador.txt"

@echo off
:Main
set sFin=FIN MATERIAL
set fListadoCorte=listacorteoptimizador.txt

setlocal enabledelayedexpansion
set bNombreFichero = 0

For /f "useback tokens=*" %%F in ("%fListadoCorte%") do (
   
   If "%%F" == "%sFin%" (
    set bNombreFichero = 0
   ) Else (
   If %bNombreFichero% == 0 (
         set fMaterial = %%F
         set bNombreFichero = 1
      ) Else (
      echo %%F >> %fMaterial%
   )
)

A ver si alguien me puede echar una mano. Gracias

;)

leogtz

En la tarde lo resuelvo, estoy en la escuela.  :-\
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

xassiz_

Código (dos) [Seleccionar]

@echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%x in (listacorteoptimizaror.txt) do (
set "line=%%x"
if "!line:~-3!"==".ad" (set "fichero=!line!")
if not "!line!"=="FIN MATERIAL" (
if not "!line:~-3!"==".ad" (echo:!line!>>!fichero!)
)
)

pause
exit


Saludos ;)



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

bjeli1980

Muchas gracias xassiz, me ha funcionando perfectamente.

¿para que sirve "!line:~-3!"==".ad"?

¿xq pones !line!>>!fichero! entre admiraciones?


xassiz_

#4
Lo primero se llama extracción de carácteres y lo segundo polimetría. Hay mucha info sobre estas cosillas te explico lo primero así por encima, la polimetria es muy extensa:


set variable=holanomostrarmundo
echo %variable:~0,4% %variable:~13,5%

Creo que el ejemplo lo explica todo, ahora con valores negativos:


set variable=holanomostrarmundo
echo %variable:~0,4% %variable:~-5%


Al igual que:

set archivo=algo.txt
echo Extension: %archivo:~-4%

o

set archivo=algo.ad
echo Extension: %archivo~-3%


[Tutorial] Polimetria by Smartgenius


Saludos ;)



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

bjeli1980

Muchas gracias!!!

Me queda mucho por aprender. :-(


ADRIANGUDU

Hola, soy nuevo en esto de programar y tengo un problema similar al posteado pero no logro adecuar el codigo a mis necesidades.

mi archivo se llama 'Query_infos_archivo_DDDPLUS.txt' y el formato es este:

----------------------------------------------
<fdaDeployJob xml:lang="es-ES">
  <fileInfo>
   <displayName>Plus_IMS_ARG_DDDLEG_002_A_20120801.ZIP</displayName>
   <description>DATOS AR_DDDPLUS Argentina Ambiente plus Agosto 2012 CLIENT SERVICE, IMSHEALTH
    <additionalInfo></additionalInfo>
    <loginRequired>0</loginRequired>
    <approved>1</approved>
    <emailNotification>1</emailNotification>
   <activeDate>2012/09/19</activeDate>
   <expirationDate>2012/10/30</expirationDate>
    <fileRule>
      <productRestrictions>
      </productRestrictions>
      <companyRestrictions>
      </companyRestrictions>
      <productCompanyRestrictions>
      </productCompanyRestrictions>
      <individualRestrictions>
       <individualEmail owner="1">aduran@ar.imshealth.com</individualEmail>   
       <individualEmail owner="0">mechenique@ar.imshealth.com</individualEmail>
      </individualRestrictions>
<fileUploader> </fileUploader>
</fileRule>
  </fileInfo>
</fdaDeployJob>
----------------------------------------------

Esto se repite muchas veces en un txt y necesito generar varios archivos txt que corten cuando encuentre la linea </fdaDeployJob> y darle el nombre que en este caso sería Plus_IMS_ARG_DDDLEG_002_A_20120801.ZIP el cual siempre esta en la misma linea.

Gracias


Eleкtro

#7
Cita de: ADRIANGUDU en 19 Septiembre 2012, 15:59 PMnecesito generar varios archivos txt que corten cuando encuentre la linea </fdaDeployJob> y darle el nombre que en este caso sería Plus_IMS_ARG_DDDLEG_002_A_20120801.ZIP

EDITO: Código mejorado
@Echo OFF
Title By Elektro H@cker
Setlocal enabledelayedexpansion

:::::::::::::::::::
Set "FILE=Test.XML"
:::::::::::::::::::

If Exist "%FILE%" (Echo Archivo a procesar: "%FILE%" | MORE) ELSE (Echo Archivo "%FILE%" no encontrado & Exit /B 1)

:: Creamos un archivo temporal y le agregamos X lineas en blanco para evitar errores en el SORT de Batch.
REM Ajustamos el número de lineas a agregar para agilizar el proceso de generación de archivos.
REM 100 lineas si el archivo original tiene menos de 100 lineas.
REM 1.000 lineas si el archivo original tiene entre 100 y 999 lineas.
REM 10.000 lineas si el archivo original tiene entre 1.000 y 9.999 lineas.
REM 100.000 lineas si el archivo original tiene entre 10.000 y 99.999 lineas.
REM 1.000.000 lineas si el archivo original tiene entre 100.000 y 999.999 lineas o más de 1.000.000 de lineas.
For /F %%a in ('Type "%FILE%" ^| find /V /C ""') do (Echo %%a>"%TEMP%\%FILE%" & FOR %%? IN ("%TEMP%\%FILE%") DO (SET /A "longitud=%%~z? - 3"))
Echo+ > "%TEMP%\%FILE%"
IF "%LONGITUD%" LEQ "2" (Set /A "LINES=100")
IF "%LONGITUD%" EQU "3" (Set /A "LINES=1000")
IF "%LONGITUD%" EQU "4" (Set /A "LINES=10000")
IF "%LONGITUD%" EQU "5" (Set /A "LINES=100000")
IF "%LONGITUD%" GEQ "6" (Set /A "LINES=1000000")
Echo Generando un archivo temporal, espere...
For /L %%X in (2,1,%LINES%) Do (Echo+ >> "%TEMP%\%FILE%")

:: Eliminamos las lineas en blanco del archivo original y copiamos el resto en el archivo temporal.
Type "%FILE%" | FINDSTR "." >> "%TEMP%\%FILE%"

:: Obtenemos los nombres de las imagenes. ("<displayName>")
For /F "Tokens=3 Delims=:<>" %%# in ('Type "%FILE%" ^| FIND /I "displayName"') do (Set /A "NUM_NAME+=1" && Set "NAME!NUM_NAME!=%%#")

:: Obtenemos el número de las lineas que contienen los delimitadores [A] y [B]. ("<fdaDeployJob" y "</fdaDeployJob>")
For /F "Delims=:" %%X in ('findstr /I /N "<fdaDeployJob "  "%TEMP%\%FILE%"') do (Set /A "NUM_A+=1" && Set "Delimiter_A_!NUM_A!=%%X")
For /F "Delims=:" %%X in ('findstr /I /N "</fdaDeployJob>" "%TEMP%\%FILE%"') do (Set /A "NUM_B+=1" && Set "Delimiter_B_!NUM_B!=%%X")

:: Cortamos y generamos los archivos.
Echo+ & Echo Generando los archivos, espere... | MORE

For /L %%X in (1,1,%NUM_B%) Do (
For /F "Tokens=* Delims=:" %%@ in ('Type "%TEMP%\%FILE%"') do (

Set /A "LINE+=1"
SET "String=%%@"

IF NOT "!LINE!" GTR "!Delimiter_B_%%X!" (
IF "!LINE!" GEQ "!Delimiter_A_%%X!" (
IF NOT "!STRING!" EQU " " (
ECHO !STRING!>> "!NAME%%X!.XML"
)
)
)
)
Set /A "LIN_A=!Delimiter_A_%%X! - %LINES%", "LIN_B=!Delimiter_B_%%X! - %LINES%"
Set /A "LINE=0"

Echo [+] !NAME%%X!.XML
Echo     (Linea !LIN_A! hasta Linea !LIN_B!^) | MORE
)

Echo Listo.
Pause&Exit


 

Output:

Plus_IMS_ARG_DDDLEG_002_A_20120801.ZIP.XML:
<fdaDeployJob xml:lang="es-ES">
 <fileInfo>
  <displayName>Plus_IMS_ARG_DDDLEG_002_A_20120801.ZIP</displayName>
  <description>DATOS AR_DDDPLUS Argentina Ambiente plus Agosto 2012 CLIENT SERVICE, IMSHEALTH
   <additionalInfo></additionalInfo>
   <loginRequired>0</loginRequired>
   <approved>1</approved>
   <emailNotification>1</emailNotification>
  <activeDate>2012/09/19</activeDate>
  <expirationDate>2012/10/30</expirationDate>
   <fileRule>
     <productRestrictions>
     </productRestrictions>
     <companyRestrictions>
     </companyRestrictions>
     <productCompanyRestrictions>
     </productCompanyRestrictions>
     <individualRestrictions>
      <individualEmail owner="1">aduran@ar.imshealth.com</individualEmail>    
      <individualEmail owner="0">mechenique@ar.imshealth.com</individualEmail>
     </individualRestrictions>
<fileUploader> </fileUploader>
</fileRule>
 </fileInfo>
</fdaDeployJob>


Plus_IMS_ELEKTRO_H@CKER.ZIP.XML:
<fdaDeployJob xml:lang="en-EN">
 <fileInfo>
  <displayName>Plus_IMS_ELEKTRO_H@CKER.ZIP</displayName>
  <description>blablablabla
   <additionalInfo></additionalInfo>
   <loginRequired>0</loginRequired>
   <approved>1</approved>
   <emailNotification>1</emailNotification>
  <activeDate>2011/11/22</activeDate>
  <expirationDate>2011/11/22</expirationDate>
   <fileRule>
     <productRestrictions>
     </productRestrictions>
     <companyRestrictions>
     </companyRestrictions>
     <productCompanyRestrictions>
     </productCompanyRestrictions>
     <individualRestrictions>
      <individualEmail owner="1">www.elhacker.net</individualEmail>    
      <individualEmail owner="0">Elektro H@cker</individualEmail>
     </individualRestrictions>
<fileUploader> </fileUploader>
</fileRule>
 </fileInfo>
</fdaDeployJob>


Y con esto cierro el tema, haz el favor de leer las normas, has revivido un tema de 2 años de antiguedad sin aportar nada, debes formular tu pregunta en un nuevo topic.

Saludos.

EDITO 2: [BATCH] [APORTE] TextCutter (Delimita texto de un archivo y lo corta en trozos)








Eleкtro

#8
El mensaje '[Batch] Crear varios txt a partir de otro txt [Solucionado]' fue bloqueado
tema antiguo revivido
Leer reglas:
http://foro.elhacker.net/reglas