2014-03-31 28 views
-1

我有以下格式的csv;停止正則表達式匹配後選擇第一個字符

"12345"|"ABC"|"ABC"[tab delimeter] 
"12345"|"ABC"|"ABC"[tab delimeter] 
"12345"|"ABC"|"ABC"[tab delimeter] 

然而,標籤也出現在文本中,我要刪除哪些沒有被preceeded的選項卡的「

我有以下的正則表達式這凸顯其後面沒有標籤」 \t[^\"] 但是這突出顯示了標籤後面的字符,我想只選擇並移除標籤。

注意:不知道這是否重要,但我在TextPad中運行命令之前,我在Perl中運行它。

編輯測試數據http://pastebin.com/dYfrcSPc

+0

所以有標籤和換行符? –

+1

爲什麼不使用csv解析器,http://search.cpan.org/~adamk/Parse-CSV-2.00/lib/Parse/CSV.pm – Toto

+0

您是否需要刪除非*直接*之後的選項卡報價,直接在引號之前,或不在引號內的選項卡? – Robin

回答

1

使用這一個:

\t(?!") 

這意味着tab字符後面沒有一個"字符。

+0

當我把它放到我的Perl中時,我得到一個錯誤,它在$ string = s/\附近引發了一個sytax錯誤」(完整的字符串)'$ string =〜s/\ t(?!「)/ g;' – Intern87

+0

正確的語法是's/regex/replace/g',這意味着在'g'之前缺少另一個'/' –

0

好,最簡單的方法將使用負回顧後...

s/(?<!")\t//g; 

...因爲它只會匹配那些tab字符無法通過性格"前面。但是如果你的Perl不支持的話,不要擔心 - 有另一種方式:

s/([^"])\t/$1/g; 

...也就是說,更換任何非"符號之後\t單獨該符號。

1

如果您無法下載一個適當的CSV模塊,如Text::CSV,你可以使用一個輕量級的替代方案,是核心的一部分:Text::ParseWords

use strict; 
use warnings; 
use Text::ParseWords; 

while (<DATA>) { 
    my @list = quotewords('\t', 1, $_); 
    tr/\t//d for @list; 
    print join "\t", @list; 
} 

__DATA__ 
"12345"|"ABC "|"ABC" next field 
"12345"|"ABC"|" ABC" next field 
"123 45"|"ABC"|"ABC" next field 

(注:Tab字符可能已破壞的計算器格式)

這將解析行並忽略帶引號的選項卡。然後,我們可以簡單地將它們移除並將它們放回到一起。

相關問題