perlを使用してcsvファイルのテキストを検索しようとしています。しかし、完全に一致する必要があります。単語Uを検索しているかどうかを確認しましょう。スクリプトで、結果にUSを表示したくありません。最初と最後に「」と/bを使用してみましたが、CSVから配列に値を保存すると機能しますが、CSvで直接検索したい場合は機能しません。my $ curr = U if(grep $ curr、 "test.csv")print "Done"
これは私に出力として米国を示しています
まず、誤解を解かせてください。これ:
grep "U", "test.csv"
... stringgrep
のファイルではなく、 true と評価される項目の文字列のリストを grepします (これはすべての項目で、常に true です)。Perl では、次のように引数のリストに適用されます。test.csv
U
test.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
これは完全な解決策ではありませんが、目的地にたどり着く方法を理解できるはずです。
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