比较两个文件与英语和日语数据

时间:2011-04-15 18:49:01

标签: regex perl hash string-comparison

我被要求比较两个包含日语和英语信息的文件。我使用慢速方法,读取两个文件并将它们放在两个数组中,然后使用while循环检查File_B的TERMS是否在File_A的行中。

FILE_A:

这是一个男孩。

ハンカ

她是个女孩。

我是个男人。

这个苹果很大。

橙色很小。

FILE_B:

ハンカ

输出:

我是个男人。

这个苹果很大。

我写的程序运行正常。但是,我正在处理的文件非常庞大。如果我像这样使用循环,运行时间会很慢。我的朋友告诉我,我可以将文件放入哈希值,它运行得更快。我可以看到使用它的重点,但我拥有的文件是随机的,File_B中的术语也可以在File_A的任何部分。之前的一些帖子建议我可以使用拆分File_A的行,将行放入哈希并将其与File_B进行比较(也将File_B放在另一个哈希中)。但是,我不知道如何使用〜//来检查该行是否得到了该术语。

open(A_FILE, "<", "FILE_A.txt");
my(@a_lines) = <A_FILE>; # read file into list
close(A_FILE);
open(B_FILE, "<", "FILE_B.txt");
my(@b_lines) = <B_FILE>; # read file into list
my($b_lines);
close(B_FILE);
open(my $out, ">",  "Useful.txt") or die "Can't open Useful.txt: $!";
$number = @b_lines;

foreach $a_line (@a_lines) # loop thru list
{
   $found = 0;
   my $sentence = $a_line;
   $i = 0;
   chomp($sentence);
   while (($i <= $number-1) and ($found == 0)){
       chomp($b_lines[$i]);
       if ($sentence =~ /$b_lines[$i]/){
           $found = 1;
       }
       $i++;
   }

   if ($found == 1) {
       print $out $sentence."\n";
   }
}

2 个答案:

答案 0 :(得分:0)

我没有看到哈希表如何帮助您搜索子字符串。不过,这对于完全匹配很有用。

如果您的内存不是约束,也许您可​​以从所有文件A条目中构建suffix tree,这样可以在文件B条目上提供非常快的O(N)次搜索时间。

答案 1 :(得分:0)

如果你在linux上运行,你可以编写一个shell脚本来对文件进行排序,然后使用'uniq'程序。首先对大文件进行排序,然后比较它们,而无需将整个文件读入内存。