【发布时间】:2014-06-20 08:50:53
【问题描述】:
我正在处理大文件。我想知道,在您看来,当您想知道 $file1 中的单词“x”是否出现在 file2 的句子“y”中时,处理大文件的最佳方法是什么。 我的文件有超过 20000 行..
例子:
这是第一个文件的内容:
eat
take
breath
you
alpha
这是第二个文件的内容:
eat,hungry
love,lovers
me,mine
take,taken,give
you,u,yo
fun,funny
这是我可能期望的第三个文件的内容
eat : eat,hungry
take : take,taken,give
you : you,u,yo
所以如你所见,我想在第一个文件的单词的第二个文件中找到匹配的表达式。
我的解决方案 - 但循环永远不会结束 -
解决方案1:
$file1= "words.txt";
$file2 = "expressions.txt";
$out = "out.txt";
open (W, "<", $file1);
open (E, "<", $file2);
open (OUT, ">", $out);
while(defined($l = <W>)){
@a = split (/\n/, $l);
push @w, @a;
}
while(defined($l2 = <E>)){
for ($i = 0; $i < @w; $i++){
if (grep /\Q\b$w[$i]\b\E/, $l2){ #or just /\b$w[$i]\b/
print OUT "$w[$i] : $l2\n";
}
}
}
解决方案2:
$file1= "words.txt";
$file2 = "expressions.txt";
$out = "out.txt";
open (W, "<", $file1);
open (E, "<", $file2);
open (OUT, ">", $out);
while(defined($l = <W>)){
@a = split (/\n/, $l);
push @w, @a;
while(defined($l2 = <E>)){
@b = split (/\n/, $l2);
push @e, @b;
}
for ($k = 0; $k < @e; $k++){
for ($i = 0; $i < @w; $i++){
if (grep /\b$w[$i]\b/, $e[$k]){
print OUT "$w[$i] : $w[$l]\n";
}
}
}
【问题讨论】:
-
旁注,
$l2 =~ /\Q\b$w[$i]\b\E/比grep /\Q\b$w[$i]\b\E/, $l2更好,如果你想匹配单词边界而不是字面\b然后/\b\Q$w[$i]\E\b/ -
好的,我编辑了。但是,为什么第一个表达式更好?
-
$l2 =~ ..更好,因为它可以更好地传达意图,即匹配正则表达式与单个字符串。
标签: perl grep filehandle