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

Iniciado por Eleкtro, 20 Septiembre 2012, 07:52 AM

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

Eleкtro

He visto estos últimos años a mucha gente preguntando como delimitar un texto para cortarlo en trozos, y generar los subarchivos delimitados, así que me he visto en la casi necesidad de crear esta función para ese propósito, así les será más fácil.

@Echo OFF
Title TEXTCUTTER [By Elektro H@cker]

REM Call :TEXTCUTTER "ARCHIVO" "DELIMITADOR (A)" "DEIMITADOR (B)"

:: Ejemplo
Call :TEXTCUTTER "TEST.XML" "<fdaDeployJob" "</fdaDeployJob>"

Pause&Exit

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:TEXTCUTTER
Echo # # # # # # # #
Echo #             #
Echo # TEXT CUTTER # by Elektro H@cker
Echo #             #
Echo # # # # # # # # | MORE

Setlocal enabledelayedexpansion

Set "FILE=%~nx1"
SET "Delimiter_A=%~2"
SET "Delimiter_B=%~3"

:: Comprobaciones iniciales
If Exist "%FILE%" (
Echo # Procesar archivo : "%FILE%"
Echo # Delimitar desde  : "%Delimiter_A%"
Echo # Delimitar hasta  : "%Delimiter_B%" | MORE
) ELSE (Echo Archivo "%FILE%" no encontrado & GOTO:EOF)

Type "%FILE%" | FIND "%Delimiter_A%" >NUL || (Echo No se ha encontrado ninguna cadena con el delimitador (A^): "%Delimiter_A%" & GOTO:EOF)
Type "%FILE%" | FIND "%Delimiter_B%" >NUL || (Echo No se ha encontrado ninguna cadena con el delimitador (B^): "%Delimiter_B%" & GOTO:EOF)

:: 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 el número de las lineas que contienen los delimitadores [A] y [B].
For /F "Delims=:" %%X in ('findstr /I /N "%Delimiter_A%" "%TEMP%\%FILE%"') do (Set /A "NUM_A+=1" && Set "Delimiter_A_!NUM_A!=%%X")
For /F "Delims=:" %%X in ('findstr /I /N "%Delimiter_B%" "%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!>> "%~n1_%%X_%~x1"
)
)
)
)
Set /A "LIN_A=!Delimiter_A_%%X! - %LINES%", "LIN_B=!Delimiter_B_%%X! - %LINES%"
Set /A "LINE=0"

Echo [+] "%~n1_%%X_%~x1"
Echo     (Linea !LIN_A! hasta Linea !LIN_B!^) | MORE
)
Setlocal disabledelayedexpansion

Echo Listo.
GOTO:EOF




PD: Recuerden, así pueden ocultar la salida:
Código (dos) [Seleccionar]
Call :TEXTCUTTER "ARCHIVO" "DELIMITADOR (A)" "DEIMITADOR (B)" >NUL

Espero que les séa de ayuda.
Saludos.




El archivo que he usado en el ejemplo:
Test.XML
Código (XML) [Seleccionar]
----------------------------------------------
<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>
----------------------------------------------  
<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>
----------------------------------------------