• Publicidad

Cómo detectar una línea en blanco

¿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 detectar una línea en blanco

Notapor Skull118 » 2013-04-18 09:15 @427

Buenos días, maestros de Perl. Hoy acudo a ustedes debido a que no he encontrado lo que necesito. Tal vez me puedan orientar de mejor manera.

Básicamente lo que necesito es saber cuándo es una línea vacía dentro de un archivo .txt. Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
linea 1
linea 2

linea 4
linea 5
linea 6

linea 8
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que necesitaría es detectar en este caso que la línea 3 y la 7 está vacía. La lectura del archivo línea por línea ya la tengo. Lo único que no he logrado hacer es detectar cuándo una línea está vacía. La linea la leo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $l=@archivo[$r]
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


He utilizado el buscador de esta página, sin resultados que me favorezca. De antemano les agradezco la ayudada.
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Publicidad

Re: Cómo detectar una línea en blanco

Notapor explorer » 2013-04-18 09:28 @436

No nos dices si las líneas que lees contienen el/los caracteres de nueva línea, o no.

Una cosa antes: lees mal las líneas. Lo correcto es así:

$l = $archivo[$r];

El signo '$' es importante, pues indica que estamos recuperando solo un elemento de dentro de @archivo.

Podrías hacer una comparación para localizar esa líneas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($l eq "\n") {              # ver si la línea solo contiene el carácter de nueva línea
  2.     ...;
  3. }
  4.  
  5. if ($l eq "") {                # ver si la línea realmente no contiene nada
  6.     ...;
  7. }
  8.  
  9. if ($l =~ /^$/) {              # otra forma de comprobarlo: usamos un patrón que dice que no hay nada
  10.     ...;                       # entre el principio (^) y el final ($) de la línea
  11. }
  12.  
  13. if (length($l) == 0) {         # no hay nada de nada
  14.     ...;
  15. }
  16.  
  17. if (not length $l) {           # que no, que no hay nada...
  18.     ...;
  19. }
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 detectar una línea en blanco

Notapor Skull118 » 2013-04-18 09:42 @446

Gracias compañero, el proceso de lectura del archivo línea por línea sí me funciona, intentaré aplicar lo que me sugeriste, el proceso de lectura lo tengo de esta manera, la cual funciona como lo necesito, y de nuevo, muchas gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(A, "$na") || die "No pude leer el archivo: $!";           
  2.   @archivo=<A>;
  3.   for($r=1; $r<=@archivo; $r++){
  4.         $l=@archivo[$r];
  5.   }
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Re: Cómo detectar una línea en blanco

Notapor explorer » 2013-04-18 09:51 @452

Pues no, está mal. Tienes que cambiar la '@' por el '$'.

Y en el bucle debes comenzar por el índice 0. Los arrays, en Perl, comienzan por el indice 0. Y por lo tanto, debes también cambiar '<=' por un '<', porque si no, estarás leyendo una línea demás. Quedaría así:
for($i = 0; $i < @archivo; $i++) {

Otra forma de leer el archivo (de las muchas que hay):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(my $ARCHIVO, '<', $na)  or  die "No pude leer el archivo $na: $!\n";
  2.  
  3. while (my $linea = <$ARCHIVO>) {
  4.     chomp $linea;                         # quitamos el carácter de nueva línea
  5.  
  6.     ...;                                  # procesamos la $linea
  7. }
  8.  
  9. close $ARCHIVO;
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 detectar una línea en blanco

Notapor Skull118 » 2013-04-18 09:55 @454

Muchas gracias, explorer. Con la expresión siguiente realicé lo que necesitaba

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(NA "> resultado.txt");
  2. if (not $l eq "\n"){
  3.   print(NA "$l");
  4. }
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Re: Cómo detectar una línea en blanco

Notapor explorer » 2013-04-18 10:48 @492

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(my $ENTRADA, '<', $na)              or  die "No pude leer el archivo $na: $!\n";
  2. open(my $SALIDA,  '>', 'resultado.txt')  or  die "No pude escribir el resultado.txt: $!\n";
  3.      
  4. while (my $linea = <$ENTRADA>) {
  5.  
  6.     if ($linea ne "\n") {                 # si la línea es distinta de una línea vacía
  7.         print $SALIDA $linea;             # la imprimimos
  8.     }
  9. }
  10.  
  11. close $ENTRADA;
  12. close $SALIDA
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esto se puede realizar incluso desde la línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -n -E  'print if $_ ne "\n"' na.txt > resultado.txt
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 detectar una línea en blanco

Notapor carlitos_30 » 2013-04-26 10:03 @460

Hola.

Hay que considerar que a lo mejor la línea tiene espacios (" "), también.

¿Entonces no quedaría mejor usando expresiones regulares?


m/^\s*$/ :idea:
carlitos_30
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2012-12-28 09:08 @422

Re: Cómo detectar una línea en blanco

Notapor explorer » 2013-04-26 13:59 @624

Según el título de este hilo (línea en blanco), sí, habría que contemplar esa posibilidad.

Pero en el primer mensaje, Skull118 habla de línea vacía, así que eso es lo que he tomado en cuenta...

Realmente, esas líneas no están vacías del todo, sino que, como mínimo, contendrán el carácter o caracteres de nueva línea.
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 detectar una línea en blanco

Notapor pvaldes » 2013-04-28 05:23 @266

Alternativamente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (/^\s?$/){
  2.              print "aquí hay una línea vacía (o con espacios únicamente)";
  3.              }
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es algo más portátil porque no todos los sistemas operativos usan el "\n".
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Cómo detectar una línea en blanco

Notapor explorer » 2013-04-28 06:42 @321

pvaldes escribiste:Es algo más portátil porque no todos los sistemas operativos usan el "\n".
Perl sabe lo que significa "\n" en cada sistema operativo, así que es perfectamente válido usarlo en un programa, sin importar en qué sistema operativo estés.

Extraído de perlport:
PROBLEMAS
Nuevas líneas
En la mayor parte de los sistemas operativos, las líneas en los archivos terminan con caracteres de nueva línea. Lo que se define como "nueva línea" es lo que varía entre los sistemas. Tradicionalmente, en Unix se usa "\012", en los sistemas de la familia DOS se usa "\015\012", y el Mac OS usa "\015".

Perl usa "\n" para representar la nueva línea "lógica", donde lo que significa lógica puede depender de la plataforma que se esté usando. En MacPerl, "\n" siempre significa "\015". En los perl de los sistemas DOS, "\n" normalmente significa "\012", pero cuando se accede a un archivo en modo "texto", perl usa la capa ":crlf" que lo traduce a (o desde) "\015\012", dependiendo de si está leyendo o escribiendo. Unix hace lo mismo en las tty en modo canónico.

...
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