2012-03-23 120 views
0

我有一個CSV文件,格式如下,我使用的是基於逗號作爲分隔符的Perl split命令。問題是我有一個嵌入逗號的引用字符串"HTTP Large, GMS, ZMS: Large Files",它失敗。數組值只有更少的元素。我如何修改split命令。像嵌入的逗號使用分隔符解析CSV中帶引號的字符串CSV文件

my @values = split('\,', $line); 

CSV文件

10852,800 Mob to Int'l,235341739,573047,84475.40,0.0003,Inbound,Ber unit 
10880,"HTTP Large, GMS, ZMS: Large Files",52852810,128,13712.68,0.0002,,Rer unit 
13506,Presence National,2716766818,2447643,309116.40,0.0001,Presence,per Cnit 
+6

你的問題引出了一個問題 - 爲什麼不使用(例如)在['文本:: CSV'(http://search.cpan.org/~makamaka/Text- CSV-1.21/lib/Text/CSV.pm)模塊,它可以爲你處理這種問題? – 2012-03-23 04:58:54

+2

所有程序員都應該學習的一節課:切勿自行解析CSV或HTML。使用現有的模塊,它們通常是成熟的,穩定的並且經過良好測試。 – dgw 2012-03-23 10:25:11

回答

4

問題正是爲什麼創建模塊,如Text::CSV。如果,但只有在數據沒有嵌入逗號的情況下,纔可以使正則表達式起作用。當數據嵌入逗號時,是時候轉移到一個專用於處理帶有嵌入逗號的CSV的工具,並且這將是Perl中的Text::CSV(及其親屬Text::CSV_PPText::CSV_XS)。

+0

我需要使用Text :: CSV_PP或Text :: CSV_XS?有什麼不同?它會在perl上運行,爲sun4-solaris-64-ld構建的v5.8.7 – Arav 2012-03-23 06:32:06

+1

您可以使用並安裝'Text :: CSV';它帶有純粹的Perl實現'Text :: CSV_PP'('_PP'後綴表示'純Perl',不需要C編譯器)。然後爲了最大限度地發揮系統的性能,您安裝了'Text :: CSV_XS',它使用Perl擴展機制和C代碼函數來實現相同代碼的更高版本。自從有了Perl 5.8之前,'Text :: CSV'就已經出現了。它可以在5.8.7下正常工作。不過,目前的維護者首次發佈的版本是在2007年。 (通過我的私人檔案進行搜索,我從1997年7月發現了Text-CSV-0.01.tar.gz。) – 2012-03-23 06:45:36

+0

非常感謝信息 – Arav 2012-03-27 03:11:40

0

我也使用了與您的方法相同的方法,它適用於我。試試這個代碼。

my @values = split(/(?<="),(?=")/, $line); 

希望它有助於

+1

您的代碼違反了OP的數據,在此:'1234'你的文件中有嵌入式的「」,「」,「它會中斷嗎?」如果你只是使用「Text :: CSV」模塊,你知道它會返回正確的文件。 – 2012-03-23 13:38:33

+0

非常感謝信息 – Arav 2012-03-27 03:12:24

+0

@ Ven'Tatsu我明白了你的觀點,但我只是根據他的例子和代碼提出了我的選擇。根據他分裂的問題進行更正。 – quinekxi 2012-04-03 09:36:45

相關問題