[AYUDA]Con Modificacion de Archivo de Texto

Iniciado por FranciskoAsdf, 28 Mayo 2010, 09:08 AM

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

FranciskoAsdf

Hola Saludos a todos! :

Que fome estar molestando de nuevo, pero es que no me resulta un código y no sé porque :S, les voy a explicar un poco para ver si alguien me puede ayudar T_T:

A ver tengo un archivo llamado plu.txt que contiene datos como los siguientes :


000145,       000145, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  5,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER TOTTAL
000148,       000148, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPER TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TOTTAL

(solo pegué unos pocos ya que son cientos de lineas :S)

Cada linea del archivo de "identifica" por el código PLU que está antes de la primera "coma" (,).
Lo que yo necesito es modificar el valor "5" que está antes de la octava coma de un PLU (codigo) especifico.

Por ejemplo debo modificar el valor 5 del codigo 000148:

Tengo el txt así:

000145,       000145, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  5,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER TOTTAL
000148,       000148, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPER TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TOTTAL


Y me tiene que quedar así


000145,       000145, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  5,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER TOTTAL
000148,       000148, 0,   2499, 0,000000,0,  25,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPER TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TOTTAL


Después de intentar varias cosas he llegado hasta el siguiente código, pero no me funciona como yo quiero porque me modifica todas las lineas y yo solo necesito hacerlo en las que yo le diga al code :S, he aquí el código:

Código (dos) [Seleccionar]

@Echo Off
SetLocal EnableDelayedExpansion
Set /P "Plu=Ingrese Plu :"

For /F "Tokens=1,9 Delims=,[] Skip=2" %%f In ('Find "%plu%" plu.txt /n') Do (
Set "Linea=%%f"
Set "dato=%%g"
)

For /F "Tokens=* Delims=" %%x In ('Type plu.txt') Do (
Set Linea=%%x
Set Linea=!Linea:%dato%=  25!
Call :Show !Linea!
)
Pause

:Show
Echo %* >> SalidaPLU.txt

Goto :Eof


Pero no sé porque no me funciona D:

Espero que alguien me pueda ayudar, ya que son varias las lineas que debo modificar, y no siempre van a ser las mismas :S.


De ante mano muchas gracias

Se despide y saluda atte
Francisco.

PD: El formato del archivo siempre es el mismo, comas espacios y eso xD.
PD2: Ya me leí el tema "acciones sobre archivos de texto" de leo, de hecho gracias a ese tema he conseguido mi code xD
Asdf debería ser algún tipo de función.

leogtz

Lo que no especificaste es si el código 000148 se repite a lo largo del archivo, o si solo aparece una sola vez.

En fin, veré qué puedo hacer.

¿Para qué quieres hacer esto?
Código (perl) [Seleccionar]

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

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

FranciskoAsdf

#2
Hola Leo saludos :)

Ninguno de los codigos se repiten en el archivo, son unicos.

Y lo necesito para mi trabajo, ya que me lleva mas de media hora hacer este proceso :(, y el problema es que esto lo hago al salir de mi trabajo ( por una cuestion que no viene al caso) y asi me podria ahorrar varios minutos .

PD: Son varios los codigos que debo cambiar, el que puse es solo un ejemplo .


Espero me puedas ayudar :)!


Saludos
Asdf debería ser algún tipo de función.

leogtz

#3
Bueno, hice esto:

Teniendo el archivo con el siguiente contenido:

C:\>type FILE.TXT
000145,       000145, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER
TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER
TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  2,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER TO
TTAL
000148,       000148, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPER
TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TO
TTAL

C:\>


El siguiente script modifica la linea con la ocurrencia indicada por la cadena indicada, modo de uso:

code.bat código sustitución

Ejemplos:


C:\>type file.txt
000145,       000145, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER
TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER
TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  5,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER TO
TTAL
000148,       000148, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPER
TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TO
TTAL

C:\>code 000148 34
000145,       000145, 0,   2499, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER
TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER
TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  5,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER TO
TTAL
000148,       000148, 0,   2499, 0,000000,0,  34,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPE
R TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TO
TTAL

C:\>code 000145 -4
000145,       000145, 0,   2499, 0,000000,0,  -4,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER
TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER
TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  5,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER TO
TTAL
000148,       000148, 0,   2499, 0,000000,0,  34,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPE
R TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TO
TTAL

C:\>code 000147 345
000145,       000145, 0,   2499, 0,000000,0,  -4,  0,       0,1,0,0,KUCHEN MANZANA FAMILIAR,SUPER
TOTTAL
000146,       000146, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN MIGA (STROISSER),SUPER
TOTTAL
000147,       000147, 0,   2990, 0,000000,0,  345,  0,       0,1,0,0,PIE DE LIMON FAMILIAR,SUPER
TOTTAL
000148,       000148, 0,   2499, 0,000000,0,  34,  0,       0,1,0,0,KUCHEN DURAZNO SUPER TOT,SUPE
R TOTTAL
000149,       000149, 0,   1299, 0,000000,0,  5,  0,       0,1,0,0,KUCHEN ALEMAN,SUPER TOTTAL
000150,       000150, 0,      0, 0,000000,0,  5,  0,       0,1,0,0,QUEQUE INGLES MEDIANO,SUPER TO
TTAL


Código (dos) [Seleccionar]

@ECHO OFF
IF ["%1"]==[""] (GOTO:ERROR)
SETLOCAL ENABLEDELAYEDEXPANSION
REM EL NÚMERO DE LÍNEA A MODIFICAR:
FOR /F "TOKENS=1, 2 DELIMS=:" %%A IN ('TYPE "FILE.TXT" ^| FINDSTR /I /N /R "^%1"') DO (
SET "LINEA=%%A"
SET "CONTENIDO=%%B"
)
FOR /F "TOKENS=1-6*" %%A IN ("%CONTENIDO%") DO (
(
ECHO %LINEA%
ECHO %%A      %%B %%C   %%D %%E  %2,  %%G
ECHO W
ECHO E
) | EDLIN /B FILE.TXT > NUL 2>&1
)
TYPE "FILE.TXT"
GOTO:EOF
:ERROR
ECHO ERROR CON ARGUMENTOS.
EXIT /B 1
GOTO:EOF


Saludos.
Código (perl) [Seleccionar]

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

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

FranciskoAsdf

#4
Hola Leo de nuevo T_T ( y muchas gracias por tu tiempo) :

Al parecer hay algún problema con el peso del archivo, te preguntarás por que el peso, pues lo que pasa es que probando y probando, me he dado cuenta que hay un tope de lineas (o de peso de datos) que edlin puede leer, porque me he fijado hasta que código editaba la linea y he dividido el archivo original en dos partes.

Por ejemplo con el archivo completo (sin dividir) solo edita hasta el código 051822 (que es la linea 388), y el no editaba el código que seguía el 051823, bueno pues seleccioné todo lo que seguía hasta el código 51823 (dejando este el principio del archivo, como primer código) y lo pegué en otro archivo, corrí el script sobre el archivo y funcionó, después que no editaba el código 051823 ahora si editaba el código 051823, aunque este código estaba al principio del nuevo archivo, seguí probando hasta que código editaba, y después de casi el mismo numero de lineas ya no editaba más, volví a dividir el archivo (ya vamos en 3 partes xD) y pasó lo mismo.-

Me fijé en el peso de los archivos y es de 37kb y fracción.-
Así pues es por eso que pienso que tiene que ver algo con eso del peso o con la cantidad de datos que puede manejar EDLIN.-


Entonces estoy como PLOP!, no sé que se podrá hacer en estos casos :S.

Muchos saludos y gracias de nuevo, pero es que no sé como lo puedo solucionar :S.-


Saludos :)!

Te dejo el link con el archivo completo.-

Link de txt

El problema es que este archivo se genera diariamente, si no, seria super fácil modificarlo y cargar el mismo archivo siempre, pero no se puede ya que los valores van cambiando segun se necesite :/


Disculpa las molestias, espero me puedas segui ayudando :)
Asdf debería ser algún tipo de función.