Archivo bat necesito apoyo con la generacion de un bat para cambiar cadena de texto de un archivo por un enter

Este en un ejemplo:

En la tercera linea se esta juntando la cuarta linea con la tercera que comienza asi |1|LINE| el apoyo es para crear un bat que haga la tarea de poner un enter para que la extructura quede de manera correcta est o es un ejemplo la cantidad de datos de del aprox 45 MB algo que pueda utilizar.?

1|LINE|IVA0|NC|064U|CFDIAA  8752413|022649|21-07-2019|
1|LINE|IVA0|NC|090U|CFDIIGJ  267189|022909|21-07-2019|
1|LINE|IVA0|FC|055U|CFDIAA  8751659|021559|21-07-2019|1|LINE|IVA0|FC|055U|CFDIAA  8751660|021559|21-07-2019|

1|LINE|IVA0|NC|090U|CFDIIGJ  267189|022909|21-07-2019|

2 Respuestas

Respuesta
1

Yo con el BAT no puedo ayudarte, pero si no es un ejercicio que tengas que hacer así porque te lo han pedido, yo usaría Notepad++ (prueba gratuito que puedes descargar de su web) y con la herramienta Reemplazar es algo que puedes hacer de forma sencilla.

Respuesta
1

Creo que la solución que te propone Luis H. puede ser válida, sobre todo si se trata de algo a realizar una sola vez. Si fuera algo más repetitivo la solución con un bat sería más razonable. Prueba este bat:

@echo off
del /q kkk.txt
for /f "tokens=1,2,3,4,5,6,7,8,* delims=|" %%a in (valerias.txt) do (
echo %%a^|%%b^|%%c^|%%d^|%%e^|%%f^|%%g^|%%h^|>>kkk.txt
if not "%%i"=="" echo %%i>>kkk.txt
)

Donde pone VALERIAS.TXT debes poner el nombre del archivo que quieres tratar. El resultado del tratamiento se deja en el archivo KKK.TXT. De esta forma no se sobreescribe el archivo original. Por supuesto el BAT depende mucho de que el formato de las líneas del archivo a tratar sea exactamente el que has puesto en la consulta, al menos en lo que se refiere al número de campos y al separador ("|").

Por lo que entido al aumentar los campos a 38 qudaria así,¿?

@echo off
del /q kkk.txt
for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,* delims=|" %%a in (Valerias.txt)
do (
echo %%a^|%%b^|%%c^|%%d^|%%e^|%%f^|%%g^|%%h^|%%i^|%%j^|%%k^|%%l^|%%m^|%%n^|%%ñ^|%%o^|%%p^|%%q^|%%r^|%%s^|%%t^|%%u^|%%v^|%%w^|%%x^|%%y^|%%z^|%%aa^|%%ab^|%%ac^|%%ad^|%%ae^|%%af^|%%ag^|%%ah^|%%ai^|%%aj^|%%ak^|
>>kkk.txt
if not "%%al"=="" echo %%al>>kkk.txt
)

Si tus líneas tienen más de 26 campos no servirá la solución que te he propuesto porque si buscas en la ayuda del FOR (por ejemplo tecleando FOR /? en una ventana de "Símbolo del sistema") verás que dice algo como:

Puede especificar hasta 26 símbolos a través de la línea tokens=, siempre y cuando no cause
un intento de declarar una variable mayor que la letra 'z' o 'Z'. Recuerde, los nombres de variables de FOR son de una sola letra y distinguen
mayúsculas de minúsculas. Además, las variables son globales y no puede haber más de 52 variables activas al mismo tiempo.

De modo que habría que pensar en otra forma de hacerlo. Me ayudaría que me pasaras algunas líneas "reales" para ver si se me ocurre algo.

He encontrado otra solución, también muy ajustada al caso concreto. En esta ocasión exige que todas las "líneas reales" tengan la misma longitud (configurable, eso sí):

@echo off
Setlocal EnableDelayedExpansion
del /q kkk.txt>nul 2>&1
set longlin=55
set /a desp=%longlin%-1
set control=0
for /f "tokens=*" %%a in (valerias.txt) do (
   set lin=%%a
   if not "!lin:~%longlin%,1!"=="" set control=1
   if !control!==0 echo %%a>>kkk.txt
   if !control!==1 echo !lin:~0,%desp%!>>kkk.txt&echo !lin:~%desp%!>>kkk.txt&set control=0
)

Si todas las líneas cumplen ese requisito solo tienes que poner el valor de la longitud en LONGLIN. Ya me contarás.

¡Gracias! 

Muchas gracias quedo perfecto, con esto he podido reducir el volumente  de trabajo manual,.

Muchas gracias, por el apoyo..

Aunque no aporta nada nuevo a lo ya hecho, debo reconocer que antes de la solución que te pasé el 8 de agosto había estado probando una similar a la que voy a pasar ahora pero no conseguía que funcionara. Se me quedó la "espina clavada" y poco a poco he ido entendiendo que la presencia de caracteres "pipa" (o pipeline, el carácter "|") era la causa del problema. Esta es esa otra solución:

@echo off
Setlocal EnableDelayedExpansion
del /q kkk.txt>nul 2>&1
set nomarch=valeria.txt
set desp=54
set cadena="|1|"
set control=0
for /f "tokens=*" %%a in (%nomarch%) do (
   set lin=%%a
   echo "%%a" ^^| find %cadena%>nul&&set control=1
   if !control!==0 echo %%a>>kkk.txt
   if !control!==1 echo !lin:~0,%desp%!>>kkk.txt&echo !lin:~%desp%!>>kkk.txt&set control=0
   )

Se basa en la obviedad de que las líneas indebidamente concatenadas se caracterizan por la presencia en ellas de la cadena "|1|" que solo aparece en ellas. Por tanto son estas líneas las que precisan de un tratamiento especial (el mismo usado en la otra versión). He intentado salvar la limitación de tener que poner a pelo el desplazamiento (en mis archivos de prueba es 54) buscando en la propia línea la posición dentro de la línea en la que se presenta esa cadena pero de nuevo la presencia de los caracteres "|" me ha tirado por tierra mis rutinillas de búsqueda y al final he abandonado. Al menos de momento.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas