• Publicidad

Programa que cuente las veces que se repite un nombre

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

Programa que cuente las veces que se repite un nombre

Notapor carlosjrf88 » 2012-04-15 06:31 @313

Necesito crear un programa que cuente el número de veces que aparece un nombre en un fichero de texto y lo almacene por columnas. ¿Alguna idea? Gracias de antemano, el foro está siendo de gran ayuda.
carlosjrf88
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-04-14 12:30 @563

Publicidad

Re: Programa que cuente las veces que se repite un nombre

Notapor explorer » 2012-04-15 08:15 @385

Ese problema está comentado varias veces a lo largo de estos foros (usa el sistema de búsqueda).

Incluso se trata de un problema tan común que también está descrito en los perlfaq. Concrétamente, en el perlfaq6. Escribe en tu ordenador perldoc -q word y saldrá una sección llamada How can I print out a word-frequency or line-frequency summary? donde te explican que eso se resuelve de forma sencilla usando hashes.

Inténtalo, y si te atascas, avísanos.
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: Programa que cuente las veces que se repite un nombre

Notapor carlosjrf88 » 2012-04-15 11:48 @533

He encontrado esto:

#!/usr/bin/perl

use strict;
use warnings;


my $archivo = 'nombres.txt';

my %Palabras;

open my $FILE, '<', $archivo or die("No pude abrir el archivo: $!");

while (my $linea = <$FILE>) {

chomp $linea;

$Palabras{lc $_}++ for split /\s+/, $linea;

}

close $FILE;




for my $palabra ( sort { $Palabras{$b} <=> $Palabras{$a} } keys %Palabras) {
print $Palabras{ $palabra } . " - " . $palabra . "\n";
}

Lo que me hace es contar las veces que se repite una palabra, lo que necesitaría sería que me contara las veces que se repite el nombre completo con apellidos. Sería algo así por si no me explico bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Carlos ss ss
Benito vv vv
Carlos ss ss
Benito vv vv
Francisco ww ww
Juan ll pp
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y lo que me mostrara el programa sería esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Carlos ss ss 2
Benito vv vv 2
Francisco ww ww 1
Juan ll pp 1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Gracias por la ayuda.
carlosjrf88
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-04-14 12:30 @563

Re: Programa que cuente las veces que se repite un nombre

Notapor explorer » 2012-04-15 12:15 @552

¡Ah!, pero es que entonces no estamos buscando palabras, sino conjuntos de palabras.

No queda más remedio que usar una expresión regular o, si se trata de palabras fijas, usar la función index() (perldoc -f index).

Tienes que leer todo el texto en una sola variable escalar, quitando los caracteres de avance de línea y sustituyéndolos por un espacio en blanco (para evitar los casos en los que un nombre de una persona aparezca partido al final de una línea y principio de la siguiente.

Luego, hacemos un bucle por los nombres que queremos buscar. Por cada uno, hacemos
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $pos = 0;
  2. my $veces = 0;
  3. while (($pos = index($texto, $nombre, $pos)) != -1) {
  4.     $veces++;                          # contamos una aparición más
  5.     $pos += length $nombre;            # siguiente posición de búsqueda
  6. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

y ya tenemos todas las $veces que aparece $nombre dentro del $texto.
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: Programa que cuente las veces que se repite un nombre

Notapor carlosjrf88 » 2012-04-15 12:31 @563

¿Cómo hago para leer todo el texto en una variable escalar?

Lo que tendría que hacer sería abrir el archivo con los nombres y a partir de ahí contar las veces que se repite el nombre completo.

Estoy un poco perdido, gracias.
carlosjrf88
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-04-14 12:30 @563

Re: Programa que cuente las veces que se repite un nombre

Notapor carlosjrf88 » 2012-04-15 12:47 @574

Ya lo he arreglado, ya me sale el programa, gracias.
carlosjrf88
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-04-14 12:30 @563

Re: Programa que cuente las veces que se repite un nombre

Notapor explorer » 2012-04-15 13:05 @587

No es tan sencillo... además de leer las líneas, hay que comprobar el último carácter de cada línea, para ver si es un blanco, o no:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $texto;                               # almacén
  2.  
  3. open my $fh, '<', 'texto.txt' or die;
  4. while (my $linea = <$fh>) {
  5.     chomp $linea;                        # quitamos los finales de línea
  6.  
  7.     if ($linea =~ /\S$/) {               # si el último carácter NO es un espacio,
  8.         $linea = "$linea ";              # le ponemos uno
  9.     }
  10.  
  11.     $texto .= $linea;                    # acumulamos las líneas en el almacén
  12. }
  13. 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: Programa que cuente las veces que se repite un nombre

Notapor carlosjrf88 » 2012-04-15 13:32 @606

Lo he hecho de esta manera:

y %cuantas_veces_sale;
open(DATOS,'<nombres.txt') or die "ERROR: No pude abrir el fichero: $!\n";
while (my $nombre = <DATOS>) {
chomp $nombre;
$cuantas_veces_sale{$nombre}++;
}
close(DATOS);

open(DATOS,'<nombres2.txt') or die "ERROR: No pude abrir el fichero: $!\n";
while (my $nombre = <DATOS>) {
chomp $nombre;
$cuantas_veces_sale{$nombre}++;
}
close(DATOS);

for my $nombre (sort keys %cuantas_veces_sale) {
print "$nombre = $cuantas_veces_sale{$nombre}\n";
}


Y me sale bien, me cuenta las veces que aparece cada nombre a partir de dos archivos.

Ahora necesito hacerlo también a partir de las generaciones de nombres aleatorios. He usado este programa:

#!/usr/bin/perl
@caracteres = qw (Rodriguez-Fernandez,Carlos Baena-Rey,Alfredo Sanchez-Pelaez,Rafael Rodriguez-Sanchez,Benjamin Navas-Lopez,Juan);

for ($x=0;$x<=21;$x++){

$rand = int(rand( @caracteres));
$caracter_rand = $caracteres[$rand];
print "$caracter_rand\n";

}

Lo que necesito ahora es a partir de los nombres aleatorios que obtengo, contarlos tal y como he hecho con el programa de antes, pero no me sale. ¿Cómo tendría que poner el programa para que sea igual al anterior?
carlosjrf88
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-04-14 12:30 @563

Veces que se repite un nombre a partir de nombres aleatorios

Notapor carlosjrf88 » 2012-04-15 14:05 @628

¿Cómo puedo unir estos dos programas en uno? Sería sacar unos nombres aleatorios y contar las veces que se repiten.

Para los nombres aleatorios uso este programa:

#!/usr/bin/perl
@caracteres = qw (Rodriguez-Fernandez,Carlos Baena-Rey,Alfredo Sanchez-Pelaez,Rafael Rodriguez-Sanchez,Benjamin Navas-Lopez,Juan);

for ($x=0;$x<=21;$x++){

$rand = int(rand( @caracteres));
$caracter_rand = $caracteres[$rand];
print "$caracter_rand\n";

}

Para contar las veces que se repite un nombre completo a partir de un archivo uso este:

y %cuantas_veces_sale;
open(DATOS,'<nombres.txt') or die "ERROR: No pude abrir el fichero: $!\n";
while (my $nombre = <DATOS>) {
chomp $nombre;
$cuantas_veces_sale{$nombre}++;
}
close(DATOS);

open(DATOS,'<nombres2.txt') or die "ERROR: No pude abrir el fichero: $!\n";
while (my $nombre = <DATOS>) {
chomp $nombre;
$cuantas_veces_sale{$nombre}++;
}
close(DATOS);

for my $nombre (sort keys %cuantas_veces_sale) {
print "$nombre = $cuantas_veces_sale{$nombre}\n";
}


Necesito contar los nombres a partir del programa de generación de nombres aleatorios. He probado de varias maneras pero todas me dan error, ¿cómo sería?

Gracias por todo, el foro me está sirviendo mucho.
carlosjrf88
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-04-14 12:30 @563

Re: Programa que cuente las veces que se repite un nombre

Notapor explorer » 2012-04-15 20:05 @878

Dices que lo has probado de varias maneras, pero no has publicado esas pruebas, que es lo interesante.

Tienes mal definido @caracteres. qw() sirve para crear una lista de elementos a partir de un conjunto de palabras, pero tú no estás usando palabras sueltas, sino que se componen de nombre y apellidos.

Mejor así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @caracteres = (
  2.     'Rodriguez-Fernandez',
  3.     'Carlos Baena-Rey',
  4.     'Alfredo Sanchez-Pelaez',
  5.     'Rafael Rodriguez-Sanchez',
  6.     'Benjamin Navas-Lopez',
  7.     'Juan'
  8. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te pido también que marques tu código con marcas Perl, para que salgan más bonitos y claros que no solo texto. Repasa la última parte de nuestras recomendaciones de publicación.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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