【问题标题】:Search for occurrences of contents of a file in another file在另一个文件中搜索文件内容的出现
【发布时间】:2011-04-09 18:57:31
【问题描述】:

我想在一个目录中的文件内容中搜索另一个目录中的文件中存在的单词。有没有比以下更好的方法? (更好的平均内存使用)

更具体地说:

文件夹 1 有几个文件,每个文件有几行文本。 文件夹 2 有几个文件,每个文件有几个单词,每个单词都在一行。 我想要做的是在文件夹1的每个文件的每一行中计算文件夹2中每个文件中每个单词的出现次数。 我希望这不会太混乱。

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
        }
    } 
}

【问题讨论】:

    标签: perl file-io


    【解决方案1】:

    一个明显的改进是首先在一个单独的循环中打开所有类别文件并将其中的单词缓存到数组的哈希中(哈希键是文件名),或者如果您不关心哪个搜索,则只需一个大数组单词来自哪个文件。

    这将避免必须重新读取每个 $file 中每一行的搜索文件 - 并有助于消除交易中重复的搜索词。

    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
    }
    

    另外,如果这些是真正的“单词”——意味着“猫”的类别需要匹配“猫狗”而不是“mcat”——我会通过拆分而不是正则表达式来计算单词的使用:

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

    【讨论】:

      猜你喜欢
      • 2013-02-03
      • 1970-01-01
      • 2013-11-24
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多