【问题标题】:Knowing delimiters for CSV file了解 CSV 文件的分隔符
【发布时间】:2011-04-18 03:36:44
【问题描述】:

这可能是一个简单的问题,但我一直未能找到满意的答案。我正在用 Java 编写一个类,该类需要接收一个 .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()。 /掌脸

【问题讨论】:

标签: java csv java.util.scanner


【解决方案1】:

考虑以下几点:

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

应该只有五个 - 最后一个逗号在引号块中,不应拆分。

不要重新发明轮子。有一些开源库可以处理这种行为。

快速谷歌搜索产生http://opencsv.sourceforge.net/,我确定还有其他人。

【讨论】:

  • 谢谢。我认为自己编写代码会更简单,因为输入总是完全相同的
  • Apache Commons CSV 是一个很好的库,可以解析和生成各种 CSV 格式以及制表符分隔的文件。
【解决方案2】:

如果您尝试阅读每个单独的项目,请尝试:

s.useDelimiter(",");

然后s.next() 将从 CSV 返回一个项目。

【讨论】:

    【解决方案3】:

    为什么在 CSV 分隔符中有一个 \n?如果 CSV 和 TXT 文件具有相同的内容,Java 没有区别。

    我想你会想要的

    s.useDelimiter(",");
    

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

    【讨论】:

    • 我必须说我更喜欢 gloomcoder 的响应而不是我自己的响应。我曾经在我们的应用程序中有一个自制的 CSV 解析器,这让我很头疼。
    【解决方案4】:

    有几种解决方法:

    方法一: 在文件扩展名中使用条件语句( if-else / switch )。

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

    方法二: 正如其他答案所建议的,使用这个:

    s.useDelimiter(",");
    

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2011-12-12
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      相关资源
      最近更新 更多