Autor
|
Tema: Modificar archivos de texto [batch] [Perl] (Leído 13,655 veces)
|
bjeli1980
Desconectado
Mensajes: 8
|
Hola,
Me ha surgido un problema que tengo que solucionar y no he dudado en recurrir a este foro, ya que otras veces me habeis echado una mano.
Tengo 16000 archivos de texto en una carpeta en los que les tengo que modificar un solo dato en cada archivo. Los archivos son de esta forma:
LST;1; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;; plb;puerta común batiente ;;0;0;1;2275.;297.;20.;0;1;2;192;0;0;0;0;0;0;;
En aquellas líneas que aparece la palabra "puerta" o "frente" necesito restarle 1 al valor que está entre el sexto y septimo punto y coma, en este caso 2275.
Por lo que esa línea quedaría así y el resto del archivo estaría igual: plb;puerta común batiente ;;0;0;1;2274.;297.;20.;0;1;2;192;0;0;0;0;0;0;;
Gracias antes de nada.
|
|
« Última modificación: 12 Mayo 2010, 12:29 pm por bjeli1980 »
|
En línea
|
|
|
|
biribau
Desconectado
Mensajes: 181
|
Es fácil si tienes perl my ($a, $_, $num, $b) = $s =~ m/(([^;]*;){6})([0-9]*)(.*)$/; $num--;
|
|
|
En línea
|
|
|
|
cgvwzq
Desconectado
Mensajes: 57
Agente P.
|
Ya lo he modificado y he añadido el bucle que recorre el directorio: :main :fichero for /f "tokens=*" %%_ in (%file%) do ( ((echo %%_ | find "puerta" > nul) || (echo %%_ | find "frente" > nul)) && (call : linea " %%_" ) || (echo %%_ >> tmp.txt ) ) :linea for /f "delims=; tokens=1-6*" %%a in (%1) do ( set "num= %%f" & set "num= !num:~0,-1!" echo %%a; %%b; %%c; %%d; %%e; !num!.; %%g; >> tmp.txt )
Al final he copiado el "num=!num:~0,-1!" de Leo, en lugar de "num=!num:.=!". Aunque funciona igual...
|
|
« Última modificación: 12 Mayo 2010, 17:48 pm por cgvwzq »
|
En línea
|
Some stuff:- www.a] parsed as ]www.a]
- Bypass elhacker's img filter with ALT attribute!
- ¿Para cuándo SQLi I y II? WZ
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Algunas preguntas. Cada archivo solo contiene esto: LST;1; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;; plb;puerta com·n batiente ;;0;0;1;2275.;297.;20.;0;1;2;192;0;0;0;0;0;0;; Es decir, ¿cada archivo solo contiene 1 vez la línea con "puerta"? ¿Podemos usar aplicaciones externas? (sed para Windows)
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
He hecho esto: Supongamos que nuestro archivo se llama "file.txt", y tiene un contenido igual al que pusiste: LST;1; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;; plb;puerta com·n batiente ;;0;0;1;2275.;297.;20.;0;1;2;192;0;0;0;0;0;0;;
La salida que da mi script es: LST;1; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;; wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;; plb;puerta com·n batiente ;;0;0;1;2274.;297.;20.;0;1;2;192;0;0;0;0;0;0;;
El script es este: rem Saber en que linea vamos a cambiar: for /f "tokens=1 delims=:" %%# in ('type "file.txt" ^| findstr /i /n "puerta"' ) do ( ) rem La linea for /f "tokens=*" %%_ in ('type "file.txt" ^| findstr /i "puerta"' ) do ( ) for /f "tokens=*" %%_ in (file.txt ) do ( rem Mostrar normalmente: if !count! lss !n_line! ( ) rem Sino, procesar: if !count! equ !n_line! ( for /f "delims=; tokens=1-6*" %%a in (' echo !linea!' ) do ( set "numero= !numero:~0, -1!" echo %%a; %%b;; %%c; %%d; %%e; !numero!.; %%g ) ) )
Obviamente tienes que volcar la salida a un archivo de texto nuevo, luego si quieres renombras. Edit, esto también funciona: @echo off setlocal enabledelayedexpansion for /f "delims=: tokens=1-2*" %%a in ('type "file.txt" ^| findstr /i /n "puerta"') do ( set "n_line=%%a" ) for /f "tokens=*" %%_ in ('type "file.txt" ^| findstr /i "puerta"') do ( set "linea=%%_" ) for /f "delims=; tokens=1-6*" %%a in ('echo !linea!') do ( set "numero=%%f" set "numero=!numero:~0, -1!" set /a numero-=1 call:edit %%a "%%b" %%c %%d %%e !numero! "%%g" goto:eof ) :edit :: ( echo %n_line% echo %1;%~2;;%3;%4;%5;%6.;%~7 %~8 echo w echo e ) | edlin /b file.txt > nul 2>&1 goto:eof
Lo edita en el mismo lugar.
|
|
« Última modificación: 12 Mayo 2010, 01:25 am por Leo Gutiérrez. »
|
En línea
|
|
|
|
bjeli1980
Desconectado
Mensajes: 8
|
Gracias a todos por responder. - biribau, había pensado en hacerlo en perl ya que en batch me resultaba más dificil, tengo q probar la solución q me das, pero primero tendría que buscar primero si la línea contiene la palabra "puerta" o "frente" - Leo, si que podemos utilizar aplicaciones externas. La palabra puerta o frente podría aparecer en más de una línea, por lo que habría que cambiarlo en varias líneas. Voy a probar lo que me habeis puesto. Ya lo he probado pero no me funciona para un fichero concreto. Me falla dentro de este for: for /f "tokens=*" %%_ in (file.txt) do ( Leo tengo que cambiarlo en 16000 ficheros, por lo que tengo q hacerlo de manera que no tenga que editarlos. Puede que la palabra puerta o frente no esté en ninguna línea del fichero, también puede ser que esté en diferentes lineas.
|
|
« Última modificación: 12 Mayo 2010, 11:13 am por bjeli1980 »
|
En línea
|
|
|
|
bjeli1980
Desconectado
Mensajes: 8
|
Al final lo he hecho en Perl, os pongo el código: Muchas gracias a todos: opendir(DIRHANDLE ,".")||die "ERROR: no se puede leer directorio actual\n"; next if ($_ eq "." || $_ eq ".."); next if (-d "$_" && ! -l "$_"); open (ENTRADA ,"<$_") || die "ERROR: No puedo abrir el fichero $_\n"; #Los copio dentro la carpeta open (SALIDA ,">modificados/$_") || die "ERROR: No puedo abrir el fichero $d/$_\n"; while ($s=<ENTRADA>) { my ($a, $_, $num, $b) = $s =~ m/(([^;]*;){6})([0-9]*)(.*)$/; if (($s =~ /puerta/ ) || ($s =~ /frente/ )) { $num--; $s = $a . $_ . $num . $b; } } }
|
|
« Última modificación: 12 Mayo 2010, 23:17 pm por Leo Gutiérrez. »
|
En línea
|
|
|
|
biribau
Desconectado
Mensajes: 181
|
$s = $a . $_ . $num . $b;
El $_ lo había puesto ahí precisamente para que se notase que había que descartarlo, seguro que te funciona? Porque hay unos paréntesis de una subexpresión que no interesa, pero hay que ponerlos por asociatividad
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
@bjeli1980
Como no habías especificado, lo hice para un solo archivo en concreto. Hacerlo con 1600 archivos sería un engorro, además de que lentísimo. Te felicito por la decisión de hacerlo en Perl.
Saludos.
|
|
|
En línea
|
|
|
|
bjeli1980
Desconectado
Mensajes: 8
|
Tienes razón, no está bien, voy a echarle un vistazo.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Acciones sobre archivos de texto. [Batch]
« 1 2 ... 34 35 »
Scripting
|
leogtz
|
348
|
442,704
|
4 Abril 2022, 19:39 pm
por **Aincrad**
|
|
|
[BATCH] Ayuda guardando archivos de texto a php
Scripting
|
Geormarsch
|
2
|
4,321
|
20 Septiembre 2011, 16:33 pm
por Poderoscuro1207
|
|
|
leer/modificar/escribir archivos de texto
Programación C/C++
|
Neibar
|
4
|
9,304
|
6 Abril 2012, 01:29 am
por Xandrete
|
|
|
batch - modificar nombres de archivos, solo sacar las letras y dejar numeros
Scripting
|
hernan35
|
3
|
7,062
|
27 Diciembre 2012, 17:41 pm
por Segadorfelix
|
|
|
modificar texto en batch
Scripting
|
brianchatran
|
3
|
2,308
|
7 Octubre 2018, 04:43 am
por **Aincrad**
|
|