0

我正在尝试使用 perl 在 csv 文件中搜索文本。但我需要完全匹配,让我们看看我是否正在搜索一个我不想让脚本在结果中显示 US 的单词。我曾尝试在开头和结尾使用“” & /b,如果我将值从 CSV 存储到数组,它可以工作,但如果我想直接在 CSV 中搜索,它不起作用。我的 $curr = U if(grep $curr, "test.csv") print "Done"

这向我展示了美国作为输出

4

2 回答 2

4

首先,让我纠正你的一个误解。这个:

grep "U", "test.csv"

...不是stringgrep的文件,它为计算结果为 true的项目的字符串列表进行 greps (这是所有项目,始终为 true)。在 Perl 中,应用于参数列表,如下所示:test.csvUtest.csv"U""U"grep

grep /foo/, @list;

但是,您不需要这样做grep。使用它意味着将整个文件读入内存来为grep.

我假设您在这里寻找的是一种简单的方法来检查 csv 文件中的确切字符串。一种简单的方法是使用否定的环视断言:

my $del = ",";     # your csv delimiter
my $search = "U";  # the text you search for

while (<>) {
    print if /(?<![^$del])$search(?![^$del])/;
}

(?<![^$del])断言字符串之前的字符不是非分隔符,同样断言(?![^$del])后面的字符不是非分隔符。双重否定可能看起来很复杂,但好处是它们还匹配搜索字符串没有被两边的分隔符包围的条件,即 csv 行的开头或结尾。

此处的菱形运算符将打开作为脚本参数提供的文件,并在 while 循环的每次迭代中通读其内容。例如:

perl mygrep.pl test.csv

这不是一个完整的解决方案,但它应该让您知道如何到达目的地。

于 2013-01-25T12:15:36.003 回答
0
perl -lne 'print if(/\bU\b/)'' your_csv_file

测试如下:

> cat temp
info   info US   info    cat
info   info U   info    cow
info   info    info    dog
info   info U   info    dinosaur 
info   info    info    bat
phoenix.209> perl -lne 'print if(/\bU\b/)' temp
info   info U   info    cow
info   info U   info    dinosaur 

或者您也可以在命令行上使用 grep,如下所示

> grep -w U temp
info   info U   info    cow
info   info U   info    dinosaur 
于 2013-01-25T12:17:34.050 回答