0

perlを使用してcsvファイルのテキストを検索しようとしています。しかし、完全に一致する必要があります。単語Uを検索しているかどうかを確認しましょう。スクリプトで、結果にUSを表示したくありません。最初と最後に「」と/bを使用してみましたが、CSVから配列に値を保存すると機能しますが、CSvで直接検索したい場合は機能しません。my $ curr = U if(grep $ curr、 "test.csv")print "Done"

これは私に出力として米国を示しています

4

2 に答える 2

4

まず、誤解を解かせてください。これ:

grep "U", "test.csv"

... stringgrepのファイルではなく、 true と評価される項目の文字列のリストを grepします (これはすべての項目で、常に 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 に答える