• Publicidad

Convertir XML en TXT

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

Notapor chechoman » 2008-07-14 14:43 @655

Bueno, explorer, ante todo muchas gracias por toda tu ayuda, y también por toda la ayuda de las demás personas que han participado en este tema.

Resulta que el problema es que los XML me vienen con una codificación que me causaba problemas (UTF-8) así que lo que tenía que hacer era leer el xml, buscar este texto y colocarle iso-8859-1 la cual es la codificación que me sirve. Al principio lo hice con un comando de Linux: sed, pero el problema era que se tardaba mucho en la ejecución, es decir, por unos 40 mil archivos tardaba alrededor de 20 minutos, así que escribí unas líneas para que hiciera todo dentro del mismo Perl ¡y la ejecución bajo a unos 7 minutos! Aquí agrego entonces el código para permitir leer las 'ñ' y los acentos en un XML:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $filename="/home/principal/lector/xml/$a";
my $oldtext="UTF-8";
my $newtext="iso-8859-1";

open (IN, "$filename") || die $!;
## imprimo el contenido moficado en el archivo .bak
open (OUT, ">$filename.bak") || die $!;
while ($_ = <IN> ) {
    ## Si existe el texto lo reemplazo
    if ($_ =~ /$oldtext/i) {
        $_ =~ s/$oldtext/$newtext/gi;
    }
    print OUT "$_";
}
close (OUT);
close (IN);
#  if ($filename =~ /\.wiki|\.awiki/)
## copio el contenido del archivo moficado .bak al archivo original
rename("$filename.bak","$filename") || die $!;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
chechoman
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2008-07-02 11:14 @510

Publicidad

Notapor explorer » 2008-07-14 17:43 @780

Dos puntualizaciones.

La primera, decirte que si los XML están en una codificación distinta de la indicada en la cabecera, entonces la culpa no es tuya, sino del origen. Que lo despidan :-)

La segunda, que no necesitas hacer nada de lo que indicas si abres el xml como te indicaba un poco más arriba, con el open().

De todas formas, enhorabuena por encontrar la solución.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14488
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Convertir XML en TXT

Notapor adrian blind » 2012-10-29 15:28 @686

Hola, buenas tardes.
Necesito de su ayuda.

Ya pude convertir archivos XML a txt como el ejemplo que menciona el compañero sólo que tengo un problema: cómo convierto el siguiente XML a texto.

Ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <Comprobante xmlns="http://www.prueba.gob.mx">
  2.    <Emisor rfc="ABC0123457A8" nombre="Hospital ABC">
  3.       <domicilio call="uno"mero="5" estado="México" />
  4.       <Expedido calle="dos"mero="10" estado="México" />
  5.    </Emisor>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Quisiera convertir lo que está en comillas dobles a un archivo txt separado por pipes '|'.
adrian blind
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-18 21:26 @935

Re: Convertir XML en TXT

Notapor explorer » 2012-10-29 16:12 @716

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

¿Tienes algo de código hecho?

¿A qué partes entrecomilladas te refieres? Son unas cuántas las que aparecen ahí...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14488
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Convertir XML en TXT

Notapor adrian blind » 2012-10-29 18:55 @830

Hola, muchas gracias.

Esto es lo poco que llevo de código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use $factura = XMLin ("C:/pruebas/prueba.xml");
  2.  
  3. print "$factura->{xmlns};
  4. Print "$factura->{Emisor}{rfc};
  5. Print "$factura->{Emisor}{nombre};
  6. Print "$factura->{Emisor}{domicilio}{calle};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Esto es correcto? y ¿cómo lo mando a un txt?

Gracias por la ayuda.
adrian blind
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-18 21:26 @935

Re: Convertir XML en TXT

Notapor explorer » 2012-10-29 19:12 @842

Necesitas aprender mucho más, pero casi lo tenías.

Con esto lo resuelves:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3.  
  4. use XML::Simple;
  5.  
  6. my $xml = XMLin('kk.xml', KeepRoot => 1);
  7.  
  8. say $xml->{Comprobante}->{xmlns};
  9. say $xml->{Comprobante}->{Emisor}->{rfc};
  10. say $xml->{Comprobante}->{Emisor}->{nombre};
  11. say $xml->{Comprobante}->{Emisor}->{domicilio}->{calle};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para guardarlo en un archivo de texto, solo tienes que agregar las órdenes de open() y close(), y agregar en los say() el gestor de archivo inicializado por open().

Más información en perlopentut.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14488
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Convertir XML en TXT

Notapor adrian blind » 2012-10-29 21:58 @956

Buenas noches, Sensei explorer.

Estuve leyendo los problemas anteriores que tuvo chechoman. Es la misma idea y ya elaboré el código con respecto al que le ayudaste a hacer a chechoman y me quedó igual que al de él,

#!/usr/bin/perl

use XML::Simple;
use Data::Dumper;

opendir(DIR,"C:/pruebas/xml/");
my @files=readdir(DIR);
closedir(DIR);

open (FacElec, ">>","C:/pruebas/FacElec.txt") or (FacElec, ">","C:/pruebas/FacElec.txt");
foreach my $a (@files){
next if $a =~ /^\./;
print "Archivos cargados";
print $a;
print \n;

my $factura = XMLin("C:/pruebas/xml/$a");

print FacElec join q{|},
$factura->{xmlns},
$factura->{'xmlns:xsi'},
$factura->{'xsi:schemaLocation'},
$factura->{version},
$factura->{serie},
$factura->{folio},
$factura->{fecha},
$factura->{metodoDePago},
$factura->{tipoDeComprobante},
$factura->{NumCtaPago},
$factura->{TipoCambio},
$factura->{Moneda},
$factura->{Emisor}{nombre},
$factura->{Receptor}{rfc},
$factura->{Conceptos}{Concepto}{cantidad},
$factura->{Emisor}{DomicilioFiscal}{calle},
print FacElec "\n";
}
print "Fin Carga";
print "\n";
close FacElec;

pero a la hora de ejecutarlo me manda el siguiente mensaje de error:

not well-formed (invalid token) at line 55, column 34, byte 2993 at C:/Perl/lib/
XML/Parser.pm line 187
Archivos cargadosprueba.xmlSCALAR(0x1577b84)Archivos cargadosprueba2.xmlSCALAR(0x324638c)

Lo ejecuto en Windows y para Linux solo me manda a imprimir "Fin Carga".

¿Cuál sería mi problema?

Este es el código que he elaborado conforme a mis necesidades y al código elaborado por chechoman y usted.

Y disculpe las molestias, es que no había trabajado con Perl y me parece maravilloso.

Gracias por todo, Sensei explorer.
adrian blind
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-18 21:26 @935

Re: Convertir XML en TXT

Notapor explorer » 2012-10-30 08:37 @401

El error 'not well-formed' indica que en esa posición, el xml no es realmente un archivo con formato XML. Es otra cosa o está mal escrito o hay un error en su confección.

Yo sí veo que entra en el bucle, porque sale el texto 'Archivos cargados'.

Debes cambiar

print $a;
print \n;

por

print "$a\n";

Te falta un open después del 'or'.

Te recomiendo que cuando publiques código Perl en estos foros, le pongas las marcas de código Perl, que aparecen cuando editar tus mensajes, en la parte superior de la caja de edición.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14488
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Convertir XML en TXT

Notapor adrian blind » 2012-10-30 14:43 @655

Muchísimas gracias, Sensei.

Ya ha quedado.

De verdad que es una maravilla esto de Perl y me voy a estar adentrándome más a esta programación.

Saludos y que este bien, Sensei.
adrian blind
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-18 21:26 @935

Re: Convertir XML en TXT

Notapor adrian blind » 2012-11-02 23:45 @031

Buenas tardes, amigos.

Otra vez yo con otra molestia. Para que me entiendan les pongo primero el código del xml y del pl para que me dé a entender.

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <cfdi:Comprobante
  3.         LugarExpedicion="Cuajimalpa de Morelos México, D.F."
  4.         metodoDePago="No identificado"
  5.         tipoDeComprobante="ingreso"
  6.         total="9993"
  7.         subTotal="8614.66"
  8.         formaDePago="PAGO EN UNA SOLA EXHIBICION"
  9.         fecha="2012-09-01T14:10:15">
  10.  
  11.   <cfdi:Emisor
  12.         nombre="BEST BUY STORES S. DE R.L. DE C.V."
  13.         rfc="BBS070606D33">
  14.     <cfdi:DomicilioFiscal
  15.                 codigoPostal="05349"
  16.                 pais="MEXICO"
  17.                 estado="D.F."
  18.                 municipio="CUAJIMALPA DE MORELOS"
  19.                 colonia="CRUZ MANCA SANTA FE"
  20.                 calle="AVENIDA SANTA FE 485 PISO 2" />
  21.   </cfdi:Emisor>
  22.  
  23.   <cfdi:Receptor
  24.         nombre="PUBLICO EN GENERAL"
  25.         rfc="XAXX010101000">
  26.     <cfdi:Domicilio
  27.                 codigoPostal="05349"
  28.                 pais="MEXICO"
  29.                 estado="D.F."
  30.                 municipio="CUAJIMALPA DE MORELOS"
  31.                 colonia="CRUZ MANCA SANTA FE"
  32.                 calle="AVENIDA SANTA FE 485 PISO 2" />
  33.   </cfdi:Receptor>
  34.  
  35.   <cfdi:Conceptos>
  36.     <cfdi:Concepto importe="7843.97" valorUnitario="7843.97" descripcion="NUEVO IPAD 32GB WIFI B" noIdentificacion="000000001000169630" unidad="PZA" cantidad="1" />
  37.     <cfdi:Concepto importe="0" valorUnitario="0.00" descripcion="KIT REWARD ZONE" noIdentificacion="000000001000019784" unidad="PZA" cantidad="1" />
  38.     <cfdi:Concepto importe="81.9" valorUnitario="81.90" descripcion="MEMORIA USB 4GB ANGRY BIRDS AZUL" noIdentificacion="000000001000169010" unidad="PZA" cantidad="1" />
  39.     <cfdi:Concepto importe="688.79" valorUnitario="688.79" descripcion="SMART CASE APPLE ROJO" noIdentificacion="000000001000172673" unidad="PZA" cantidad="1" />
  40.   </cfdi:Conceptos>
  41.  
  42. </cfdi:Comprobante>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use XML::Simple;
  4. use Data::Dumper;
  5.  
  6. opendir( DIR, "C:/pruebas/prueba/" );
  7. my @files = readdir(DIR);
  8. closedir(DIR);
  9.  
  10. open( FacElec, ">>", "C:/pruebas/FacElec.txt" ) or open( FacElec, ">", "C:/pruebas/FacElec.txt" );
  11. foreach my $a (@files) {
  12.     next if $a =~ /^\./;
  13.     print "Archivos cargados";
  14.     print "$a\n";
  15.  
  16.     my $factura = XMLin("C:/pruebas/prueba/$a");
  17.  
  18.     print FacElec join q{|},
  19.  
  20.         $factura->{LugarExpedicion},
  21.         $factura->{metodoDePago},
  22.         $factura->{tipoDeComprobante},
  23.         $factura->{total},
  24.         $factura->{subTotal},
  25.         $factura->{fecha},
  26.         $factura->{formaDePago},
  27.  
  28.         $factura->{'cfdi:Emisor'}{nombre},
  29.         $factura->{'cfdi:Emisor'}{rfc},
  30.         $factura->{'cfdi:Emisor'}{'cfdi:DomicilioFiscal'}{codigoPostal},
  31.         $factura->{'cfdi:Emisor'}{'cfdi:DomicilioFiscal'}{pais},
  32.         $factura->{'cfdi:Emisor'}{'cfdi:DomicilioFiscal'}{estado},
  33.         $factura->{'cfdi:Emisor'}{'cfdi:DomicilioFiscal'}{municipio},
  34.         $factura->{'cfdi:Emisor'}{'cfdi:DomicilioFiscal'}{colonia},
  35.         $factura->{'cfdi:Emisor'}{'cfdi:DomicilioFiscal'}{calle},
  36.  
  37.         $factura->{'cfdi:Receptor'}{nombre},
  38.         $factura->{'cfdi:Receptor'}{rfc},
  39.         $factura->{'cfdi:Receptor'}{'cfdi:Domicilio'}{codigoPostal},
  40.         $factura->{'cfdi:Receptor'}{'cfdi:Domicilio'}{pais},
  41.         $factura->{'cfdi:Receptor'}{'cfdi:Domicilio'}{estado},
  42.         $factura->{'cfdi:Receptor'}{'cfdi:Domicilio'}{municipio},
  43.         $factura->{'cfdi:Receptor'}{'cfdi:Domicilio'}{colonia},
  44.         $factura->{'cfdi:Receptor'}{'cfdi:Domicilio'}{calle},
  45.  
  46.         $factura->{'cfdi:Conceptos'}{'cfdi:Concepto'}{importe},
  47.         $factura->{'cfdi:Conceptos'}{'cfdi:Concepto'}{valorUnitario},
  48.         $factura->{'cfdi:Conceptos'}{'cfdi:Concepto'}{descripcion},
  49.         $factura->{'cfdi:Conceptos'}{'cfdi:Concepto'}{noIdentificacion},
  50.         $factura->{'cfdi:Conceptos'}{'cfdi:Concepto'}{unidad},
  51.         $factura->{'cfdi:Conceptos'}{'cfdi:Concepto'}{cantidad},
  52.  
  53.         print FacElec "\n";
  54. }
  55. print "Fin Carga";
  56. print "\n";
  57. close FacElec;
  58.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Lo que me sucede es que al momento de correr el programa no me trae la información de los conceptos.

Tengo idea de poner un ciclo en donde empiezan los conceptos a imprimir pero no sé si sea correcto.

Espero puedan ayudarme.

Gracias.
adrian blind
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-18 21:26 @935

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron