• Publicidad

Cortar un xml en dos ficheros

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cortar un xml en dos ficheros

Notapor andlarz » 2014-08-06 06:48 @325

Buenos días, ante todo presentarme en el foro, soy nuevo y ya me encuentro con la primera duda.

Tengo un fichero en una sola línea, que tiene a su vez dos ficheros xml y no sé cómo separarlos en ficheros independientes, es decir: que cada uno contenga <Document ......</Document>.

Un saludo y gracias.

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:"><CstmrPmtStsRpt><GrpHdr><MsgId></MsgId><CreDtTm></CreDtTm><InitgPty><Id><OrgId><Othr><Id></Id></Othr></OrgId></Id></InitgPty><CdtrAgt><FinInstnId><BIC></BIC></FinInstnId></CdtrAgt></GrpHdr><OrgnlGrpInfAndSts><OrgnlMsgId></OrgnlMsgId><OrgnlMsgNmId></OrgnlMsgNmId><OrgnlNbOfTxs></OrgnlNbOfTxs><OrgnlCtrlSum></OrgnlCtrlSum>........</Document><Document xmlns="urn:iso:std:iso:20022:tech:xsd:"><CstmrPmtStsRpt><GrpHdr><MsgId></MsgId><CreDtTm></CreDtTm><InitgPty><Id><OrgId><Othr><Id></Id></Othr></OrgId></Id></InitgPty><CdtrAgt><FinInstnId><BIC></BIC></FinInstnId></CdtrAgt></GrpHdr><OrgnlGrpInfAndSts><OrgnlMsgId></OrgnlMsgId><OrgnlMsgNmId></OrgnlMsgNmId><OrgnlNbOfTxs></OrgnlNbOfTxs><OrgnlCtrlSum></OrgnlCtrlSum>........</Document>
andlarz
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2014-08-06 06:15 @302

Publicidad

Re: Cortar un xml en dos ficheros

Notapor explorer » 2014-08-06 07:42 @362

Bienvenido a los foros de Perl en Español, andlarz.

Es un problema sencillo, que se resuelve aplicando una expresión regular para encontrar lo que queremos, y luego guardar el resultado en archivos separados, cuyo nombre vamos cambiando con la ayuda de la característica de Perl de incrementar cadenas de caracteres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use File::Slurp;
  5.  
  6. my $xml_archivo_original = read_file('kk.xml');
  7.  
  8. my $xml_nuevo_archivo = "salida001";                                    # debe terminar en número
  9.  
  10. while ($xml_archivo_original =~ m{(<Document .+?</Document>)}g) {       # búsqueda por todo el XML
  11.  
  12.     write_file("$xml_nuevo_archivo.xml", $1);                           # guardamos la parte encontrada ($1) en un archivo aparte
  13.  
  14.     $xml_nuevo_archivo++;                                               # magia
  15. }
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cortar un xml en dos ficheros

Notapor andlarz » 2014-08-07 02:10 @132

Muchas gracias, explorer, es justo lo que me hacía falta.

Un saludo.
andlarz
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2014-08-06 06:15 @302

Re: Cortar un xml en dos ficheros

Notapor danimera » 2014-08-08 09:59 @458

Humm... Esto quiere decir que si yo tengo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $xml_nuevo_archivo = "salida001";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y hago esto
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $xml_nuevo_archivo++;
  2. print $xml_nuevo_archivo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
¿¿¿el resultado será 'salida002'???

¿Es así, o es solo mi impresión?

Realmente no conocía esta característica de Perl.

Humm, por otro lado, ¿existirá algún enlace donde hablen de algo como: "Características de Perl que quizás no conocías" ? :D
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Cortar un xml en dos ficheros

Notapor explorer » 2014-08-08 10:53 @495

Esto está descrito en el documento perlop (en tu propio ordenador en perldoc perlop, y en la Web (traducido al español)).

En la sección "Auto incremento y auto decremento", se lee:
El operador de auto incremento contiene un poco más de magia. Si
incrementa una variable que es numérica, o que se haya utilizado en un
contexto numérico, se obtiene un incremento normal. Sin embargo, si la
variable se ha utilizado solo en contextos de cadena desde que se creó, y
tiene un valor que no es la cadena vacía y coincide con el patrón
"/^[a-zA-Z]*[0-9]*\z/", el incremento se realiza como una cadena,
conservando cada carácter dentro de su rango, conllevando a:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ++($foo = "99");      # imprime "100"
  2. print ++($foo = "a0");      # imprime "a1"
  3. print ++($foo = "Az");      # imprime "Ba"
  4. print ++($foo = "zz");      # imprime "aaa"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

"undef" se trata siempre como numérico, y, en particular, se cambia a
0 antes de incrementar (de modo que un postincremento de un valor undef
devolverá 0 en lugar de "undef").

El operador de auto decremento no es mágico.


Si no se conocen estas cosas es porque la gente: a) no lee las páginas de manual, y b) no lee el código de otras personas que sí han leído el manual (o libros de Perl) o el código de otras personas.

Y ahora ya sabes por qué existen miles de blogs y vídeos de personas que "descubren" algo extraño -de lo que sea- y se lo cuentan a los demás. En Perl tampoco es una excepción. Hay muchos blogs de perleros que enseñan estas cosas (como Perl Maven, por ejemplo).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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