2010-09-08 5 views
0

Je souhaite rechercher le contenu de fichiers dans un répertoire pour trouver des mots présents dans des fichiers d'un autre répertoire. Y a-t-il une meilleure façon de le faire que ce qui suit? (Par une meilleure utilisation de la mémoire moyenne sage)Rechercher les occurrences du contenu d'un fichier dans un autre fichier

Plus précisément:

dossier 1 a plusieurs fichiers, chaque fichier a plusieurs lignes de texte. Le dossier 2 a plusieurs fichiers, chaque fichier contient plusieurs mots, chacun sur sa ligne. Ce que je veux faire est de compter le nombre d'occurrences de chaque mot dans chaque fichier dans le dossier 2 dans chaque ligne de chaque fichier du dossier 1. J'espère que ce n'était pas trop confus.

open my $output, ">>D:/output.txt"; 

my @files = <"folder1/*">; 
my @categories = <"folder2/*">; 
foreach my $file (@files){ 
    open my $fileh, $file || die "Can't open file $companyName"; 
    foreach my $line (<$fileh>){ 
     foreach my $categoryName (@categories){ 
      open my $categoryFile, $categoryName || die "Can't open file $categoryName"; 
      foreach my $word(<$categoryFile>){ 
       #search using regex     
      } 
      #print to output 
     } 
    } 
} 

Répondre

1

Une amélioration évidente est d'ouvrir tous les fichiers de la catégorie première dans une boucle séparée et mettre en cache les mots eux dans un hachage de tableaux (hachage clé étant le nom du fichier), ou tout simplement un grand tableau si vous n » t attention quel mot de recherche est venu de quel fichier. Cela évitera d'avoir à relire les fichiers de recherche pour chaque ligne dans chaque $file - ET aider à se débarrasser des mots de recherche en double dans le marché.

use File::Slurp; 
open my $output, ">>D:/output.txt"; 

my %categories =(); 
my @files = <"folder1/*">; 
my @categories = <"folder2/*">; 
foreach my $categoryName (@categories) { 
    my @lines = read_file($categoryName); 
    foreach my $category (@lines) { 
     chomp($category); 
     $categories{$category} = 0; 
    } 
} 
# add in some code to uniquify @categories 

foreach my $file (@files) { 
    open my $fileh, $file || die "Can't open file $companyName"; 
    foreach my $line (<$fileh>) { 
     foreach my $category (@categories) { 
      # count 
     } 
    } 
    # output 
} 

En outre, si ce sont des vrais « mots » - ce qui signifie une catégorie de « chat » doit correspondre à « chien chat » mais pas « mcat » - Je compte l'utilisation du mot en divisant au lieu d'un regex:

foreach my $line (<$fileh>) { 
    my @words = split(/\s+/, $line); 
    foreach my $word (@words) { 
     $categories{$word}++ if exists $categories{$word}; 
    } 
} 
Questions connexes