【问题标题】:Skip empty lines while CSV parsingCSV 解析时跳过空行
【发布时间】:2015-12-09 12:56:56
【问题描述】:

我目前正在处理从 URL 中提取 CSV 文件并修改其条目。我目前正在使用 StreamReader 读取 CSV 的每一行并将其拆分为一个数组,我可以在其中根据其位置修改每个条目。

CSV 由电子表单提供程序生成,其中特定表单条目是多行字段,用户可以在其中添加多个注释。但是,当用户输入新笔记时,他们会用换行符分隔每个笔记。

CSV 示例:

"FName","LName","Email","Note 1: some text

Note 2: some text"

由于我的代码逐行拆分每个 CSV 条目,一旦到达这些注释,它就会认为它是一个新的 CSV 条目。这导致我的修改条目的代码不起作用,因为元素位置变得不正确。 (带有空或单行注释字段的 CSV 条目可以正常工作)

您对为此采取的最佳方法有什么想法吗?我尝试添加代码来替换回车或跳过空行,但似乎没有帮助。

【问题讨论】:

  • 这不是一个有效的 CSV 文件,您可以清理它吗?
  • 你能用.split()发布你的Reader方法吗
  • @Berger 为什么无效?它符合RFC 4180
  • 考虑使用像Apache Commons CSV这样的CSV阅读库。
  • @RealSkeptic ,我不敢相信 csv 行有换行符,我会更深入地检查 RFC :)

标签: java csv


【解决方案1】:

您可以检查一行中的第一列值是否为空。如果为空,则继续阅读下一行。

【讨论】:

  • 那么,“注2:某些文本”这一行将被认为是有效的,但它不是。
【解决方案2】:

假设您提供的 CSV 示例应该只是 CSV 文件中的 一个 条目(由于换行符,最后一个字段跨越多个不同的行),您可以尝试这样的事情,使用 2 个循环。

  1. 为当前 CSV 记录(String[] 类型)保留一个变量 currentRecord 和一个 recordList(列表或数组)以保留所有 CSV 记录。
  2. 读取 CSV 文件的一行
  3. 使用逗号作为分隔符将其拆分为字符串数组。将此数组保存在临时变量中。
  4. 如果此数组的大小为 1,则将此字符串附加到 currentRecord 中的最后一个元素(第 4 个)(如果 currentRecord 不为空)。
  5. 继续从 CSV 文件中读取行,并重复第 4 步,直到数组大小为 4。
  6. 如果大小为4,则表示该记录是CSV文件中的下一条记录,您可以将currentRecord添加到recordList
  7. 不断重复步骤 2 到 6,直到到达 CSV 文件的末尾

如果您可以删除字段中的换行符并在解析之前清理 CSV 文件,那就更好了。它会让事情变得更简单。

【讨论】:

    【解决方案3】:

    使用适当的 CSV 库来处理写入和解析。这里有一些边缘情况需要处理,不仅仅是新线。用户也可以在笔记中插入逗号或引号,自己处理会很麻烦。

    试试uniVocity-parsers,因为它可以处理解析和写入CSV时的各种情况。

    披露:我是这个库的作者。它是开源免费的(Apache V2.0 许可)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2018-02-15
      相关资源
      最近更新 更多