Jump to content
Fórum Script Brasil
  • 0

Contador de ocorrência de palavras em arquivos


Christiane Okamoto

Question

Olá!

Sou iniciante em Perl e estou com um problema. Dado dois arquivos txt contendo os seguintes textos, por exemplo:

ARQ1: ar ar

ARQ2: ar ar ar ar bola

Gostaria de contar a ocorrência de palavras de cada arquivo:

ARQ1:

ar = 2

ARQ2:

ar = 4

bola = 1

Escrevi este código:

#!/usr/bin/perl
my $dirname = $ARGV[0];
opendir(DIR, $dirname) or die "can't opendir $dirname: $!";

my %count_of;

while (defined($filename = readdir(DIR))) {
   open (FILE, $dirname . $filename);
   while (<FILE>) {
      chomp;
      $_ = lc $_; #lc = lowercase
      $_ =~ s/\d+/ /g; # remove all numbers
      $_ =~ s/[^a-zA-Z0-9'áéíóúàãõâêôçü]+/ /g;
      
      foreach my $word ( split /\s+/, $_){
      
          $count_of{$word}++;
          
      }
      
   }     
   
    #print "All words and their counts: \n";
    foreach my $word (sort {$count_of{$b} <=> $count_of{$a} } keys %count_of)
    {
      print "$word : $count_of{$word}\n";
    }
    
    
   close (FILE);
   
}
closedir(DIR);

Porém, ele me retorna:

ar = 2

ar = 6 // aqui começa a leitura do segundo arquivo, o certo seria ar = 4.

bola = 1

Acho que o problema está no vetor word, que até então não está sendo reinicializado quando se abre um novo arquivo... mas não consegui reinicializá-lo... alguma sugestão?

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Hi.

Yea, está na inicialização da hash.

Você define a hash antes do while. Ou seja, ele define, percorre diretórios e arquivos e vai incrementando.

Pra resolver isso, basta declarar a hash dentro do primeiro while.

while (defined(my $filename = readdir(DIR))) {
   open (FILE, '<', './' . $dirname . '/' .$filename);
   my %count_of = ();
Mas aí, mano. Dá pra dar uma simplificada boa nesse teu script. Olha só:
for(glob('./' . $ARGV[0] . '/*')) {
    my $count_of = {};
    open my $fh, '<', $_;
    while(<$fh>) {
        chomp;
        s/\d+/ /g;
        s/[^a-zA-Z0-9'áéíóúàãõâêôçü]+/ /g;
        $count_of->{$_}++ for split /\s+/;
    }
    print $_ . ': ' . $count_of->{$_} . "\n" for (sort {$count_of->{$b} <=> $count_of->{$a} } keys %{$count_of});
}

Enfim, nada demais... Só substitui por glob e diminui algumas linhas desnecessárias.

[]'s

Edited by Fvox
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...