2013-01-25 61 views
0

我想用perl搜索csv文件中的文本。但我需要確切的匹配,讓我看看我是否在搜索單詞U我不想讓腳本在結果中顯示美國。我曾嘗試在開始和結束時使用「」&/b,如果我將CSV值存儲到數組,但是如果我想直接在CSv中搜索,則不起作用。 我的$ CURR = U 如果(grep的$ CURR, 「test.csv」) 打印 「完成」在perl中使用grep的excel中的準確單詞匹配

這是我展示美國作爲輸出

+0

我不知道關於它的CSV一面,但是你試過使用正則表達式? perl有一些很好的正則表達式函數用於搜索,比如'/^U $ /'。 – dgBP

+1

請修改您的帖子以顯示整個代碼,包括分號等。 – Perleone

+0

分號等無問題 – Richa

回答

4

首先,請允許我糾正你的誤解。這:

grep "U", "test.csv" 

...不grep的字符串U文件test.csv,它裏grep串test.csv的物品清單,其中"U"計算結果爲真(這是所有的人,"U"始終是真實的)。在Perl,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 

這不是一個完整的解決方案,但它應該讓你知道如何獲得你要去的地方。

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 
+0

這也會匹配諸如「這不是U」和「U-boot」這樣的字符串。 – TLP

+0

耶sarathi,我只想要U,多數民衆贊成我實際上問,我只需要精確匹配 – Richa