Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Leer fichero menos la primera linea
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Lun Feb 20, 2006 12:57 pm
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Leer fichero menos la primera linea Responder citando

Otra preguntilla...

para leer la primera línea de un fichero en una variable... haría $línea=<FICHERO>;

y para leer todo el fichero menos la primera línea? hay alguna manera directa sin tener q hacer un bucle línea a línea? Necesito algo más rápido...


Gracias!!
Mensaje Lun Feb 20, 2006 1:10 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

Hay varias formas de hacerlo. Se me ocurre esta:
Código:
my @fichero = <FICHERO>;
shift @fichero;
my $variable = join '',@fichero;


Ultima edición por explorer el Lun Feb 20, 2006 1:32 pm, editado 1 vez
Mensaje Lun Feb 20, 2006 1:25 pm
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

:O gracias!!

y... que se guarde en una $variable? Es que necesito aplicarle expresiones regulares tipo "~ tr/[a-z]/[A-Z]/;" y me da error... Sad

(o alguna manera d aplicar esta expresión en una lista? :$)


----------

por cierto el shift que hace exactamente, quita la primera linea?

yo tengo (ya para poner orden):

Código:

$cap = <CADENA>;  #cojo la primera linea del fichero pq me interesa

#ahora quiero el resto en un array sin espacios y todo en mayusculas, dime si hago bien

my @cadena = <CADENA>;
shift @cadena;       # si hago esto me dice que esta vacía!
my $cadena = join '',@cadena;
$cadena=~ tr/[a-z]/[A-Z]/;    # aqui la pongo "bonita"
$cadena =~ s/\s//g;
@cadena = split //, $cadena;  # aqui lo vuelvo a poner en un array

#ahora quiero consultar el tamaño del array
$mida_cadena = $#cadena - $[ + 1;



y creo que sin el shift funciona... pero me da la sensación que se podría optimizar todo este lío de ahora lo hago cadena, luego variable y luego cadena otra vez... Smile muchas gracias en serio!
Mensaje Lun Feb 20, 2006 2:24 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

Pues debería funcionar también así:
Código:
my @cadena = <CADENA>;
my $cap = shift @cadena;
Debería funcionar si el fichero es un fichero de texto con terminaciones de línea normales.

En cuanto a lo de hacerla bonita... no queda más remedio que hacer un bucle...
Código:
@cadena = map { s/\s//g; uc($_) } @cadena;
Lo que hacemos aquí, para cada elemento ($_) de @cadena, es mapearlo en otro valor. Lo que hacemos es primero quitarle los espacios en blanco (s///) y luego lo pasamos a mayúsculas (uc()). El resultado queda en la misma @cadena.
Si te sale que @cadena está vacía, algo debe de pasar en el momento de la lectura del fichero. ¿No habrás redefinido la variable $/???
Mensaje Lun Feb 20, 2006 2:53 pm
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

ahora me va bien Smile

por cierto una ultima cosa Razz como "saco" el tamaño de la cadena? pq la forma que tenía de acceder anterior

Código:
$mida_cadena = $#cadena - $[ + 1;


ya no me sirve Sad
Mensaje Lun Feb 20, 2006 3:56 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

¿Y por qué no te vale?
$#cadena+1 debería seguir devolviendote el número de elementos del array @cadena...
Es más... sería más cómodo hacer esto:
Código:
$mida_cadena = @cadena;
Mensaje Lun Feb 20, 2006 4:08 pm
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

ahora que he estado haciendo pruebas... eso si que calculaba bien el tamaño....

lo que pasa es que al hacer
Código:
@cadena = map { s/\s//g; uc($_) } @cadena;


y luego calculo el tamaño... es como si además de los caracteres, contara los saltos de línea que habían.. o algo asi :S
Mensaje Lun Feb 20, 2006 4:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

Arreglado...
Código:
@cadena = map { chomp; s/\s//g; uc($_) } @cadena;
Mensaje Lun Feb 20, 2006 4:36 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

¿Pero quieres la longitud de toda la cadena o del número de líneas leídas?
Mensaje Lun Feb 20, 2006 4:43 pm
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

explorer escribió:
¿Pero quieres la longitud de toda la cadena o del número de líneas leídas?


quiero el numero de elementos de la cadena, una vez quitamos la primera linea del fichero (bueno, esto ya lo hace bien, claro) y una vez quitamos los espacios sobrantes (espacios, intros, etc...). Ah, y lo del chomp no me sirve Sad

gracias eh! Smile
Mensaje Lun Feb 20, 2006 4:56 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

Esto no lo he probado, pero debería funcionar...
Código:
my $cadena = join( '', map { s/\s//g; uc } <CADENA>);
print "Longitud de la cadena ", length( $cadena ), "\n";
Mensaje Mar Feb 21, 2006 8:48 am
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

con esa forma me sale una longitud inmensaaaaa, de la otra manera se acerca mas jeje.. voy a probar cosas a ver!

... alguna otra idea alguien? Como elimino las posiciones en blanco sin q las siga contando en el tamañoo?:S


----
por ejemplo con esta entrada:

>cuatrocuatro cuatro 4
a


t
cg


el resultado de
Código:
print join(",",@cadena);

    $mida_cadena = $#cadena - $[ + 1;

    print "<br>";
    print $mida_cadena;


es:

A,,,T,CG
5
Mensaje Mar Feb 21, 2006 11:20 am
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

por cierto, si no encontramos la solucion no hay problema, os pondre la que ya tenía.. a ver si la podemos "optimizar" ya que con ficheros ¿grandes? se me queda como colgado (el explorador dice k no responde)... :S
Mensaje Mar Feb 21, 2006 12:44 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

El resultado es correcto según el código que pones: hay 5 líneas (excluyendo antes la primera línea).
Pero esto no es lo que me has dicho antes, que querías saber la longitud de la cadena. En el ejemplo que mandas, creo que la salida debería ser 4, pues sólo hay 4 bases.
Esto es lo que me sale:
Código:
#!/usr/bin/perl

use warnings;
use strict;

open (my $fichero, '<', $ARGV[0]) or die "No puedo abrir $ARGV[0]: $!\n";

## Leemos la primera línea
my $linea1 = <$fichero>;

## Indefinimos la variable que indica el separador de registros de entrada
undef $/;

## con lo que en la siguiente lectura, leemos todo el fichero de golpe
my $cadena = <$fichero>;

## Filtrado de la cadena
$cadena =~ s/\s//g;
$cadena =  uc($cadena);

## Salida
print "$cadena - ", length($cadena), "\n";

close $fichero;
El resultado de cuatro.pl cuatro.txt es: ATCG - 4.
¿Es eso lo que tiene que salir?
Con un ejemplo terminaremos entendiendo lo que necesitas Smile

Ultima edición por explorer el Mie Feb 22, 2006 11:51 am, editado 1 vez
Mensaje Mar Feb 21, 2006 12:46 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4129
Ubicación: Valladolid, España
Responder citando

slopal escribió:
por cierto, si no encontramos la solucion no hay problema, os pondre la que ya tenía.. a ver si la podemos "optimizar" ya que con ficheros ¿grandes? se me queda como colgado (el explorador dice k no responde)... :S

¿explorador? ¿No se te habrá ocurrido trabajar sobre windows?
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2



Powered by phpBB © 2001, 2005 phpBB Group