• Publicidad

Eliminar marca de un XML

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Re: Eliminar marca de un XML

Notapor explorer » 2011-03-12 10:23 @474

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.006 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.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-03-12 12:21 @556

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!
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor explorer » 2011-03-12 17:23 @766

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: )
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-03-27 11:16 @511

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!
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor explorer » 2011-03-27 11:39 @527

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-03-27 17:52 @786

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.
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-05-07 08:31 @396

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?
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor explorer » 2011-05-07 09:03 @419

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-05-07 09:20 @430

Como siempre ¡das en la tecla! Muchas gracias XD
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

Re: Eliminar marca de un XML

Notapor l0g0s » 2011-06-08 11:51 @535

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?
l0g0s
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2011-03-12 08:12 @383

AnteriorSiguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados

cron