Como separo en diferentes páginas un archivo usando un .bat
Por ejemplo:
Recibo este documento:
ISA*00* *00* *01*103391843 *01*154749543 *200102*0843 *U*00401*000008252 *0*P*>~
BEG*00*SA* 005690102119** 20200102~
REF*VR*0003833700~
IEA*1*000008252~
ISA*00* *00* *01* 103391843 *01*154749543 *200102*0843* U*00401 *000008253
BEG*00*SA* 005690102120**20200102~REF*VR*0003833700 ~IEA*1* 000008253~
Quisiera sacar 2 diferentes documentos empezando por el codigo
BEG*00*SA
1 Respuesta
Entiendo que en tu ejemplo los dos archivos a obtener contendrían:
BEG*00*SA* 005690102119** 20200102~ REF*VR*0003833700~ IEA*1*000008252~ ISA*00* *00* *01* 103391843 *01*154749543 *200102*0843* U*00401 *000008253
Y
BEG*00*SA* 005690102120**20200102~REF*VR*0003833700 ~IEA*1* 000008253~
Y que los datos que preceden a la primera aparición de la cadena BEG*00*SA se desechan.
El siguiente BAT podría hacer lo que pides pero con el problema de eliminar las líneas en blanco:
@echo off Setlocal EnableDelayedExpansion set /a num=0 set cadena=BEG*00*SA set archivo=d:\bat\roselys.txt for /f "tokens=* delims=" %%x in ('type "%archivo%"') do ( echo "%%x" ^^| find "%cadena%">nul&&set /a num+=1 if not !num!==0 echo %%x>>kkk_!num!.txt )
Guardaría cada trozo en un archivo de nombre kkk_n.txt siendo n el número de orden del trozo (kkk_1.txt, kkk_2.txt, etc.). Estos archivos se crean en la carpeta desde la que se ejecute el BAT. La variable ARCHIVO debe apuntar a la ubicación del archivo de partida.
Si fuera imprescindible respetar las líneas en blanco habría que complicar el código, aunque supongo que sería posible conseguirlo.
Gracias! Muchísimas Gracias, me funciona perfecto.
SI me pudiera ayudar un poco más.
1. Quiero nombrar los.txt generados asi : (el numero que esta despues de BEG*00*SA* ).txt
2. Los txt quisiera que se generaran en una carpeta predeterminada: d/roselys/temp
GRACIAS...
Entiendo que quieres que, sobre el ejemplo que has puesto, quieres que el primero se llame 005690102119.txt y el segundo 005690102120.txt. Si el formato de la línea que empieza por "BEG*00*SA*" es fijo la cosa es fácil, y también que la carpeta destino sea d:\roselys\temp.
Este bat debería hacer las dos cosas:
@echo off Setlocal EnableDelayedExpansion set control=0 set cadena=BEG*00*SA set archivo=d:\bat\roselys.txt set carpdest=d:\roselys\temp for /f "tokens=* delims=" %%x in ('type "%archivo%"') do ( echo "%%x" ^^| find "%cadena%">nul&&( set control=1 set lin=%%x set destino=!lin:~10,13! ) if not !control!==0 echo %%x>>"%carpdest%\!destino!.txt" )
Prueba y dime como te ha ido.
Intente haciendo el siguiente cambio:
@echo off
Setlocal EnableDelayedExpansion
set control=0
set cadena=BEG*00*SA
set archivo=C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\TEMP\Costco_Orders.doc
set carpdest=C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\
for /f "tokens=* delims=" %%x in ('type "%archivo%"') do (
echo "%%x" ^^| find "%cadena%">nul&&(
set control=1
set lin=%%x
set destino=!lin:~10,13!
)
if not !control!==0 echo %%x>>"%carpdest%\!destino!.txt"
)
En el documento tengo 9 veces el BEG*00*SA y solo me crea 1 .txt
Gracias.
También intente combinar las cosas que quiero hacer:
1 . hacer el split de los documentos ( que funciono perfecto)
2. renombar esos documentos y copiarlos en una carpeta especifica y no me resulto.
Gracias!
Aprecio realmente su ayuda...
Vamos a intentar hacerlo de la forma más "elegante". Es decir, eligiendo el destino y el nombre, tal como estamos intentando como el último bat. Las pruebas que hago yo en mi entorno funcionan correctamente de modo que vamos a ver dónde puede estar el problema.
Dices que solo te crea 1 txt. ¿Lo crea en la carpeta destino elegida? ¿Qué nombre le da? Las 9 líneas de las que hablas, ¿contienen solo la cadena BEG*00*SA o son líneas que empiezan así pero tienen algo más?
Aprovecho para decirte que si quieres copiar el BAT en la página es más cómodo usar la herramienta "snippet", a la que se accede con el icono "<>" de la barra de herramientas de la página (el tercero por la derecha).
Ya logre con su ayuda que:
1 Me separara en 3 diferentes .txt empezando por el Beg
2. Me lo copia en la carpeta que quiero
3. Son líneas que compienzan así pero tienen algo más, y entre cada una tienen otras cosas también.
isa*00* *00* *01*103391843 *01*154749543 *200122*0912*u*00401*000008299*0*p*>~
gs*po*103391843*154749543*20200122*0912*8299*x*004010~
st*850*82990001~
beg*00*sa*001150122143test**20200122~
ref*vr*0003833700~
ref*dp*32*costco department~
ref*19*nw*costco region~
ref*zz*60517*buyer vendor number~
ref*zz*56*buyer vendor suffix~
ref*yd*bd229*created by~
fob*cc*zz*costco dock~
itd*01*2*****30*****rog 30~
dtm*175*20200128~
dtm*002*20200128~
dtm*010*20200128~
td5*****fedex freight e~
n9*h5*legal disclaimer~
msg*this order incorporates the costco wholesale standard terms,~
msg*as they may be amended from time to time, and any applicable~
msg*signed agreements between us.~
sac*a*zzzz***10975*******02***frt% - 3.00~
ctt*2*330~
se*30*82990001~
st*850*82990002~
beg*00*sa*005640122121test**20200122~
ref*vr*0003833700~
ref*dp*32*costco department~
ref*19*nw*costco region~
ref*zz*60517*buyer vendor number~
ref*zz*56*buyer vendor suffix~
ref*yd*bd229*created by~
fob*cc*zz*costco dock~
itd*01*2*****30*****rog 30~
dtm*175*20200128~
dtm*002*20200128~
dtm*010*20200128~
td5*****call traffic~
sac*a*zzzz***5126*******02***frt% - 3.00~
ctt*3*402~
se*33*82990002~
st*850*82990003~
beg*00*sa*005690122125test**20200122~
ref*vr*0003833700~
ref*dp*32*costco department~
ref*19*nw*costco region~
ref*zz*60517*buyer vendor number~
ref*zz*56*buyer vendor suffix~
ref*yd*bd229*created by~
fob*cc*zz*costco dock~
itd*01*2*****30*****rog 30~
dtm*175*20200128~
dtm*002*20200128~
dtm*010*20200128~
td5*****fedex freight e~
n9*h5*legal disclaimer~
msg*this order incorporates the costco wholesale standard terms,~
msg*as they may be amended from time to time, and any applicable~
msg*signed agreements between us.~
sac*a*zzzz***5126*******02***frt% - 3.00~
ctt*3*459~
se*33*82990003~
ge*6*8299~
iea*1*000008299~
Gracias
No entiendo bien cuál es el problema ahora.
1. Se generan 3 archivos TXT diferentes a partir del archivo único tratado. ¿Es correcto que sea así? ¿El nombre de esos 3 archivos es el esperado?
2. Parece que en este punto no hay problema.
3. El formato de las líneas que pones no coincide con el del ejemplo inicial. En particular es importante saber si la búsqueda de la cadena BEG*00*SA debe distinguir mayúsculas y minúsculas o no. También si el formato de la línea que contiene esa cadena es el del ejemplo, en particular en lo que hace referencia al número, que se quiere asignar al nombre el archivo. Por ejemplo en
beg*00*sa*005690122125test**20200122~
no hay espacios antes del número como los hay por ejemplo en
BEG*00*SA* 005690102120**20200102~REF*VR*0003833700 ~IEA*1* 000008253~
Si te resulta más cómodo puedes subir el fichero a algún disco en la nube y pasarme el enlace (Google Drive, Mega, etc.)
Por alguna razón la página no me dejo agregar el texto en mayúscula, por eso lo hice en minúsculas.
Se generan los archivos pero no con el nombre que necesito.
@echo off Setlocal EnableDelayedExpansion set /a num=0 set cadena=BEG*00*SA* set archivo=C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\TEMP\*.txt for /f "tokens=* delims=" %%x in ('type "%archivo%"') do ( echo "%%x" ^^| find "%cadena%">nul&&set /a num+=1 if not !num!==0 echo %%x>> C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\TEMP\costco_!num!_%date:~4,2%%date:~7,2%%date:~10,4%_%TIME:~0,2%%TIME:~3,2%.doc )
Aqui lo hice para que me genere con la fecha pero quisiera con los numeros despues del BEG*00*SA* (no hay espacios entre estos caracteres).
Gracias!
Estoy un poco confundido. Parece que estamos tratando siempre texto en mayúsculas y que no hay espacios internos en las líneas, pero no entiendo porque, si fuera así, el ejemplo inicial no cumplía esas condiciones. Ahora que veo que ya usas el snippet creo que sería mejor que me copiaras un ejemplo, lo más real posible, me dijeras que nombres querrías conseguir para los archivos con cada una de las partes y que contenidos deberían tener esos archivos. ¿Te parece bien?
Me parece excelente!
BEG*00*SA*001150122143TEST**20200122~ REF*VR*0003833700~ REF*DP*32*COSTCO DEPARTMENT~ BEG*00*SA*005640122121TEST**20200122~ REF*VR*0003833700~ REF*DP*32*COSTCO DEPARTMENT~ REF*19*NW*COSTCO REGION~
Este es un ejemplo, quisiera obtener 2 ficheros diferentes llamados:
001150122143TEST.doc
005640122121TEST.doc
Insertándolo en el código que ya tengo si fuese posible
@echo off Setlocal EnableDelayedExpansion set /a num=0 set cadena=BEG*00*SA* set archivo=C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\TEMP\*.txt for /f "tokens=* delims=" %%x in ('type "%archivo%"') do ( echo "%%x" ^^| find "%cadena%">nul&&set /a num+=1 if not !num!==0 echo %%x>> C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\TEMP\costco_!num!_%date:~4,2%%date:~7,2%%date:~10,4%_%TIME:~0,2%%TIME:~3,2%.doc )
Gracias!!!
Y que dentro de cada fichero este la información:
Por ejemplo:
El fichero 001150122143TEST.doc debe contener todo lo que este debajo de la línea que comienza por BEG hasta la próxima línea BEG
No se si me explico bien... Gracias.
Aunque me dices que lo inserte en el código que ya tienes creo que es más razonable volver a mi segunda versión, con alguna adaptación. Sería esta:
@echo off Setlocal EnableDelayedExpansion set control=0 set cadena=BEG*00*SA* set archivo=C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\TEMP\Costco_Orders.doc set carpdest=C:\GENSRVNT\FSMB\AS2\Inbound\dest\COSTCO_TEMP\ for /f "tokens=* delims=" %%x in ('type "%archivo%"') do ( echo "%%x" ^^| find "%cadena%">nul&&( set control=1 set lin=%%x set destino=!lin:~10,16! ) if not !control!==0 echo %%x>>"%carpdest%\!destino!.doc" )
Aprovecho para comentarte que no acabo de entender la razón de poner *.txt en el nombre del archivo. Si se quiere tratar más de un archivo, o todos los de extensión TXT podría hacerse pero pensaba que hablábamos de un solo archivo. Si el archivo Costco_Orders.doc contiene los datos que me has pasado deberían generarse los archivos con los nombres indicados y el contenido correspondiente. Prueba y me dices qué ha pasado.
- Compartir respuesta