2013-02-11 69 views
9

當我在使用opencsv讀取csv文件時,在字符串末尾遇到'\'時它不能正常工作。它使「字符串的一部分,而不是'\',因爲我想。我想必須有一些方法來添加另一個'\',讓它轉義'\' - 字符而不是?沒有必須。手動編輯CSV文件我已經搜查,但沒有發現任何如何使用opencsv讀取包含''的字符串?

爲了澄清我的問題,它看起來像這樣:

CSV文件

"A",  "B",  "C",  "D" 
"value 1", "value 2", "value 3", "value 4" 
"value 5", "value 6\", "value 7", "value 8" 

我的代碼看起來是這樣的(不是真的,但它顯示我的問題):

String inFile = "in.csv"; 
CSVReader reader = new CSVReader(new FileReader(inFile)); 
String[] line; 

while ((line = reader.readNext()) != null) { 
    for (int i = 0; i < line.length(); i++) { 
     System.out.println(i + " " + line[i]); 
    } 
} 

我希望這可以解析成每行4個元素的String [],但最後一行只解析爲兩個元素,如下面的輸出所示。

1 A 
2 B 
3 C 
4 D 
1 value 1 
2 value 2 
3 value 3 
4 value 4 
1 value 5 
2 value 6",value 7,value 8 

我試圖給讀者更改爲:

CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(inFile), "UTF-8")); 

,但沒有任何運氣。

回答

11

可能更改閱讀器的構造函數中的轉義字符?

CSVReader(new InputStreamReader(new FileInputStream(inFile), ',', '"', '|') 

這是假設|是不是在你的CVS使用的文件

此處瞭解詳情:http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/CSVReader.html

+0

謝謝!現在我可以按照預期閱讀該行。但是,我也有文件中的字符** | **。有什麼辦法可以跳過轉義字符嗎? – 2013-02-11 19:55:53

+4

嘗試''\ 0''。我認爲這對CVS無效 – user000001 2013-02-11 19:57:44

+0

太棒了!那樣做了。非常感謝! – 2013-02-11 19:58:51

3

反斜槓用於轉義",因爲某些值可能包含"字符,並且沒有反斜槓,您將無法包含該字符。

所以,如果你想使用\你也需要使用\來逃避它,就像你在普通的Java String中使用它一樣。

"A",  "B",   "C",  "D" 
"value 1", "value 2", "value 3", "value 4" 
"value 5", "value 6\\", "value 7", "value 8" 

要麼你修改CSV文件,或者您使用來自CSVReader另一個構造函數,您可以從中選擇轉義字符

+0

我該如何通過代碼實現這一目標? – 2013-02-11 19:48:55

+0

@ChristofferKarlsson查看編輯 – Alex 2013-02-11 19:52:22

+0

用戶明確聲明他們不能修改csv。想象一下,這是來自外部來源的髒數據。 – 2016-07-26 23:16:23

0

更清潔和推薦的解決方案是使用RFC4180Parser,而不是默認CSVParser

RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build(); 
CSVReader csvReader = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(rfc4180Parser).build(); 

參考:https://sourceforge.net/p/opencsv/support-requests/50/

相關問題