Página 2 de 3

Re: Eliminar marca de un XML

NotaPublicado: 2011-03-12 10:23 @474
por explorer
Bienvenido a los foros de Perl en Español, l0g0s

Esta es una forma de hacerlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -00 -e "$_ = <>; s{<HISTOGRAMA> .+? </HISTOGRAMA> \s*}{<HISTOGRAMA></HISTOGRAMA>}gsix; print" prueba.xml
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Esta es otra forma, un poco más corta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -00 -e "$_ = <>; s{(<HISTOGRAMA>) .+? (</HISTOGRAMA>) \s*}{$1$2}gsix; print" prueba.xml
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Eliminar marca de un XML

NotaPublicado: 2011-03-12 12:21 @556
por l0g0s
Muchas gracias.

Estoy impresionado con Perl. Pensaba hacer el vbs. De hecho ya lo tenía medio terminado, pero hay que hacer una barbaridad de cosas: abre objetos, cierra objetos, repasa línea a línea, busca, corta, monta, en fin, el código es tremendo, ¡y con Perl es una simple línea!

Re: Eliminar marca de un XML

NotaPublicado: 2011-03-12 17:23 @766
por explorer
Perl está especializado en el tratamiento de ficheros de texto, por eso es tan potente.

De todas maneras, fíjate que estamos en el foro Intermedio, y por eso se ha ofrecido una solución de una-línea, pero lo normal sería realizar una versión en forma de programa, para que los programadores más novatos entendieran bien los conceptos (ya habrá tiempo para que se metan con los arcanos más oscuros :wink: )

Re: Eliminar marca de un XML

NotaPublicado: 2011-03-27 11:16 @511
por l0g0s
Sí, porque, la verdad que cuesta entender la línea que has escrito en Perl.

Parece ser que de alguna forma sustituyes lo que está entre los primeros corchetes {} por los segundos.

Pero, por ejemplo, si quisiera eliminar unas cuantas marcas (claro, siempre podría repetir el proceso sobre el fichero resultante), pero supongo que Perl es capaz de hacerlo todo en uno, pasarle, por ejemplo, 10 o 50 marcas y que me las quite todas del tirón, o ya haría falta más de una línea, no sé.

Estaría bien una pequeña explicación de algunos comandos que has usado como $_ = <> \s* gsix.

En fin, sino es molestia, como ya digo, he intentado eliminar más de una marca a la vez y no me sale.

¡Salu2!

Re: Eliminar marca de un XML

NotaPublicado: 2011-03-27 11:39 @527
por explorer
l0g0s escribiste:Parece ser que de alguna forma sustituyes lo que está entre los primeros corchetes {} por los segundos.
En Perl, en el operador de sustitución, se pueden usar muchos delimitadores distintos. Si se usan las llaves, entonces no hay confusión con los caracteres '/', y por lo tanto, no hay que "espacarlos" para distinguirlos de los delimitadores del operador.

l0g0s escribiste:Pero, por ejemplo, si quisiera eliminar unas cuantas marcas (claro, siempre podría repetir el proceso sobre el fichero resultante), pero supongo que Perl es capaz de hacerlo todo en uno, pasarle, por ejemplo, 10 o 50 marcas y que me las quite todas del tirón, o ya haría falta más de una línea, no sé.
Una solución sería meter todas las marcas en un conjunto de alternativas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -00 -le '$_ = <>; s{<(HISTOGRAMA|DETALLE)> .+? </\1>}{<$1></$1>}gsix; print' prueba.xml
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(He vuelto a poner las comillas de Linux, que es donde trabajo)

De todas maneras, si el número de marcas empieza a crecer, es mucho mejor escribir un programa, ya que es más fácil de editar, que no una sola línea que se puede hacer muy larga y complicada.

l0g0s escribiste:Estaría bien una pequeña explicación de algunos comandos que has usado como $_ = <> \s* gsix.
El significado de $_ lo tienes en perldoc perlvar, el de <> en perldoc perlop, y el de \s* y gsix en perldoc perlre.

Re: Eliminar marca de un XML

NotaPublicado: 2011-03-27 17:52 @786
por l0g0s
Muchas gracias, es verdaderamente increíble el potencial de Perl, lo vuelvo a decir, porque la última solución que has propuesto me ha dejado de nuevo impresionado.

Disculpa si te haya consultado esas cosas en vez de buscarlas por mi mismo, pero no creas que es fácil de "googlear" $_ por ejemplo, al ser una única letra es muy difícil que los buscadores lo admitan en su búsqueda, incluso tras tu ayuda he ido a http://perldoc.perl.org/perlvar.html ( "perldoc perlvar" ) y he puesto en su buscador $_ pero no aparece nada.

Claro que luego he seguido leyendo abajo y efectivamente explica muy bien cómo Perl interpreta la variable de entrada $_.

Muchas gracias de nuevo.

Re: Eliminar marca de un XML

NotaPublicado: 2011-05-07 08:31 @396
por l0g0s
Hola,

Mientras probaba varias opciones con la línea de comandos de Perl similares a los ejemplos expuestos, algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -00 -e  "$_ = <>; s{(<tns:)}{\r\n$1}gsix; s{<(tns:imagen)> .+? </tns:imagen>}{<$1></$1>}gsix; print " C:\archivo.xml
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


aunque no tenía que ser necesariamente ese formato, también valen otros como este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -00 -le  "$_ = <>; s{<tns:imagen> .+? </tns:imagen>}{<tns:imagen></tns:imagen>}gsix; print " C:\archivo.xml
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La cuestión es que fuera cual fuera el formato, siempre que encuentra una línea en blanco se para.

Es decir siempre que encuentra una línea que no contiene ningún otro carácter aparte del "salto de carro", deja de procesar el archivo.

¿Esto es normal? ¿me equivoco en algo?

Re: Eliminar marca de un XML

NotaPublicado: 2011-05-07 09:03 @419
por explorer
Quizás el problema esté en el -00 (modo "slurp"). No sé, no lo he probado.

Una solución sería asegurarse de que se lee todo el fichero de golpe, una sola vez:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -le  "local $/; $_ = <>; s{<tns:imagen> .+? </tns:imagen>}{<tns:imagen></tns:imagen>}gsix; print " C:\archivo.xml
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Eliminar marca de un XML

NotaPublicado: 2011-05-07 09:20 @430
por l0g0s
Como siempre ¡das en la tecla! Muchas gracias XD

Re: Eliminar marca de un XML

NotaPublicado: 2011-06-08 11:51 @535
por l0g0s
Una preguntas más, para rizar el rizo, sino te importa.

¿Cómo puedo recortar tags de xml que sean mayores a un tamaño, por ejemplo 254 caracteres?