2011-04-18 130 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(",");