2011-04-18 125 views
0

這可能是一個簡單的問題,但我一直未能找到滿意的答案。我正在寫一個Java類,需要在一個.csv文件中填充三列中的雙精度。顯然.csv文件使用逗號作爲分隔符,但是當我嘗試用我的掃描儀設置它們時,掃描儀找不到任何東西。有什麼建議?瞭解CSV文件的分隔符

Scanner s = null; 
try { 
    s = new Scanner(source); 
    //s.useDelimiter("[\\s,\r\n]+"); //This one works if I am using a .txt file 
    //s.useDelimiter(", \n"); // This is what I thought would work for a .csv file 
    ... 
} catch (FileNotFoundException e) { 
    System.err.format("FileNotFoundException: %s%s", e); 
} catch (IOException e) { 
    System.err.format("IOException: %s%n", e); 
} 

樣本輸入將是:

12.3 11.2 27.0

0.5 97.1 18.3

謝謝您的時間!

編輯:固定!找到了正確的分隔符,並意識到我正在使用hasNextInt()而不是hasNextDouble()。 /捂臉

+0

你能提供您的.csv文件的樣本一行或兩行? – WhiteFang34 2011-04-18 03:43:17

+0

當然。我將它添加到我的問題 – 2011-04-18 03:44:17

+0

你可能想看看http://stackoverflow.com/questions/3908012/parsing-csv-in-java – WhiteFang34 2011-04-18 03:44:53

回答

3

考慮以下幾點:

first,second,"the third",fourth,"the,fifth" 

只應爲五 - 最後一個逗號是在報價塊,不應該分裂。

不要重新發明輪子。有開源的庫來處理這種行爲。

快速谷歌搜索產生http://opencsv.sourceforge.net/,我敢肯定還有其他人。

+0

謝謝。我認爲自己編寫代碼會更簡單,因爲輸入將始終完全相同 – 2011-04-18 03:51:13

+1

[Apache Commons CSV](https://commons.apache.org/proper/commons-csv/)是一個很好的庫,可以解析和生成各種CSV格式以及製表符分隔的文件。 – 2017-03-30 20:28:32

1

如果你想讀各個項目,嘗試:

s.useDelimiter(","); 

然後s.next()將從CSV返回一個項目。

1

爲什麼在CSV分隔符中有\ n? Java在CSV和TXT文件之間沒有區別,只要它們具有相同的內容即可。

我想你會想

s.useDelimiter(","); 

s.useDelimiter("[\\s]+,[\\s\r\n]*"); 
+0

我必須說我更喜歡glowcoder對我自己的迴應。我曾經在我們的應用程序中有一個自制的CSV解析器,它讓我感到頭痛。 – Brad 2011-04-18 03:59:07

1

有幾種方法來解決辦法:

方法1: 使用條件語句(if-else語句/開關)的文件擴展名。

if(ext == 'csv') { 
    s.useDelimiter(", \n"); 
} else if(ext == 'txt') { 
    s.useDelimiter("[\\s,\r\n]+"); 
} 

方法2: 其他答案建議,使用此:

s.useDelimiter(",");