Ir para conteúdo
Fórum Script Brasil
  • 0

Contador de ocorrência de palavras em arquivos


Christiane Okamoto

Pergunta

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 para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 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

Editado por Fvox
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...