• Publicidad

Cómo imprimo un título que está en varias líneas

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

Cómo imprimo un título que está en varias líneas

Notapor wampaier » 2009-08-27 12:02 @543

¿Qué tal...? Si alguien me puede ayudar a este pequeño problema... tal vez sea muy simple... si me podrían ayudar mucho mejor... el problema es este... quisiera imprimir de un archivo más o menos como este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AD  - Center for Medical, Agricultural, and Veterinary Entomology, USDA-ARS, 1600 SW
      23rd Drive, Gainesville, FL 32608, USA.
FAU - Pridgeon, Julia W
AU  - Pridgeon JW
FAU - Bernier, Ulrich R
AD  - Central Research & Development, E. I. DuPont de Nemours and Company, Wilmington,
      DE 19880-0328, USA.
FAU - Feaster, John E
AU  - Feaster JE
FAU - Scialdone, Mark A
AD  - The Caribbean Epidemiology Centre, Federation Park, Port-of-Spain, Trinidad and Tobago. [email protected]
FAU - Rawlins, S C
AU  - Rawlins SC
FAU - Hinds, A
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Este es el archivo de entrada... y mi parseo quiero que sea este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AD  - Center for Medical, Agricultural, and Veterinary Entomology, USDA-ARS, 1600 SW
AD  - Central Research & Development, E. I. DuPont de Nemours and Company, Wilmington,
AD  - The Caribbean Epidemiology Centre, Federation Park, Port-of-Spain, Trinidad and Tobago. [email protected]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Mi problema es que no me pone el título completo.

Gracias
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Publicidad

Re: Cómo imprimo un título que está en varias líneas

Notapor explorer » 2009-08-27 12:39 @569

Yo no me he enterado del problema. ¿Qué es un título? ¿Dónde dices que no aparece completo?

Y lo más importante... ¿dónde está el código que has probado y no te funciona?
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: Cómo imprimo un título que está en varias líneas

Notapor wampaier » 2009-08-27 12:48 @575

Bueno, el archivo es como el que acabo de poner... lo que quiero extraer es lo que está en negritas... pero en el código que yo tengo no me lo pone completo... (es un código muy simple) pero el problema es que no me imprime completo AD
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2.  
  3. open(my $fh, $ARGV[0]) || die "Error al abrir el archivo\n";
  4.  
  5. while(<$fh>)
  6. {
  7.         if ($_ =~ /(AD\s+\W+\s+.*\n)/)
  8.         {
  9.                 print $1 . "\n";
  10.         }
  11.  
  12. }
  13. close(FH);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Re: Cómo imprimo un título que está en varias líneas

Notapor explorer » 2009-08-27 13:34 @607

De acuerdo, si la cuestión es sacar sólo las líneas que comienzan por AD, prueba con

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2. open (my $fh, $ARGV[0]) or die "Error al abrir el archivo: $!\n";
  3. while (<$fh>) {
  4.     if (/^AD/) {
  5.         print;
  6.     }
  7. }
  8. close $fh;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o de forma más abreviada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2. open (my $fh, $ARGV[0]) or die "Error al abrir el archivo: $!\n";
  3. while (<$fh>) {
  4.     print if /^AD/
  5. }
  6. close $fh;
Coloreado en 0.001 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: Cómo imprimo un título que está en varias líneas

Notapor wampaier » 2009-08-28 08:28 @394

Ok, pero vuelvo a lo mismo: no me imprime la línea completa de "AD", solo me imprime la primera línea y un ejemplo es esto:

AD - Center for Medical, Agricultural, and Veterinary Entomology, USDA-ARS, 1600 SW 23rd Drive, Gainesville, FL 32608, USA.
Este es un título completo de AD que se encuentra en 2 o hasta en 3 líneas... cuando yo a la hora de correr el programa solo me imprime la primera línea.

Mi programa solo me da esta salida:
AD - Center for Medical, Agricultural, and Veterinary Entomology, USDA-ARS, 1600 SW
Ese es el problema que tengo...
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Re: Cómo imprimo un título que está en varias líneas

Notapor explorer » 2009-08-28 10:12 @467

Claro... porque no nos has explicado lo que significaba "título entero" :)

Esta es una de las peores formas de resolverlo... para ver si alguien se anima a hacerlo de forma más corta y/o elegante.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. open my $fichero, q[<], 'kk.txt' or die "ERROR: No pude abrir el fichero: $!\n";
  7.  
  8. my $titulo    = '';
  9. my $en_titulo = 0;
  10.  
  11. while (<$fichero>) {
  12.  
  13.     if (/^AD/) {
  14.         $en_titulo = 1;
  15.     }
  16.     elsif (/^[A-Z]/) {
  17.         $en_titulo = 0;
  18.         print "$titulo\n" if $titulo;
  19.         $titulo = '';
  20.     }
  21.  
  22.     if ($en_titulo) {
  23.         chomp;
  24.         s/^\s+/ /;
  25.         $titulo .= $_;
  26.     }
  27. }
  28.  
  29. close $fichero;
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: Cómo imprimo un título que está en varias líneas

Notapor wampaier » 2009-08-28 12:28 @561

¿Hay alguna otra manera de hacerlo... con poco código?
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Re: Cómo imprimo un título que está en varias líneas

Notapor explorer » 2009-08-28 12:45 @573

Aquí hay otra forma, pero es muy enrevesada.

Creo que es la primera vez, en estos foros, que uso el operador '...':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. open my $fichero, q[<], 'kk.txt' or die "ERROR: No pude abrir el fichero: $!\n";
  7.  
  8. while (<$fichero>) {
  9.  
  10.     if (my $flip_flop = /^AD/ ... /^[A-Z]/) {  # Si estamos en el conjunto de líneas interesantes
  11.         chomp;                                 # Quitamos el retorno de carro a la línea
  12.         s/\s\s+/ /g;                           # Quitamos los espacios en blanco sobrantes
  13.         print;                                 # Sacamos la línea
  14.         if ($flip_flop =~ /E/) {               # Pero, si además, es la última del título,
  15.             print "\n";                        # Ahora sí que sacamos un retorno de carro
  16.         }
  17.     }
  18. }
  19.  
  20. close $fichero;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

A ver si alguien lo hace más claro...
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: Cómo imprimo un título que está en varias líneas

Notapor explorer » 2009-08-28 13:13 @592

Bueno, parece que hay poca gente hoy...

Aquí está la solución con expresiones regulares:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $texto = do { local $/; open FILE, 'kk.txt'; <FILE> };    # Lectura ultra rápida. Mejor usar File::Slurp
  7.  
  8. $texto =~ s/\s\s+/ /smg;                  # Quitamos espacios en blanco superfluos
  9.  
  10. while ($texto =~ /^(AD .*?)^[A-Z]/smg) {  # Capturamos todo el texto entre AD y la siguiente línea que empieza por mayúsculas
  11.     print $1;
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Actualización: Me he dado cuenta de que el programa fallará si el $texto termina en un título. Ese último título no lo sacará.
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: Cómo imprimo un título que está en varias líneas

Notapor netsoul » 2009-08-28 15:16 @678

Yo también me quiero unir. :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. netsoul@intel:~$ perl -00pe 's/^(AD.+)\n\s+(.+$)|^(AD.+)|.+\s/$1$2$3/mg' kk.txt > kk2.txt
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Puede que tenga fallas (y algunas redundancias) porque aún no lo verifiqué.
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado