【问题标题】:Csv data reading issueCSV数据读取问题
【发布时间】:2018-06-22 15:41:24
【问题描述】:

示例 csv 数据:

1,"Robert,Adams,Washington,US
2,"Madhu",Grant,Oregon,US
3,Mohan,Young,Texas,US

第一个条目由两列组成 1 RobertAdamsWashingtonUS

其余两列打印正确,在第一个条目中,应用程序搜索右双引号,所有其余列都被视为一列

并显示封装标记和分隔符之间的错误 Invalid char。正确阅读此 csv 的方法应该是什么? (JAVA)

【问题讨论】:

  • 嗯......“拉屎 => 拉屎”。更正 CSV 文件!
  • 是的,这是最后一个选项。因为数据非常大,我必须检查每一行
  • 那么,到底在问什么?如何以编程方式更正 CSV 文件?这是一件非常复杂的事情(因此对于 SO 来说太宽泛了)。这样的文本文件中有很多可能出错的地方。
  • 是的,我知道它太宽泛了。但是如果他们是解决方案,那么是的,以编程方式怎么办?我试过了,但没有运气

标签: java csv parsing apache-spark


【解决方案1】:

正确读取此 csv 的方法应该是什么。

正确的做法是拒绝它。格式不正确。

  • 如果我们不允许引号中的行分隔符,则第 1 行有一个以双引号开头但没有右双引号的字段。

  • 如果我们允许引号内的行分隔符,那么第一行将继续到第二行,但2," 之后的字符是非法的。

(由您决定引号内的行分隔符是否对您的应用程序有意义。)

我不建议您尝试将此数据视为“良好”。这显然是不正确的,并且接受不正确的数据作为正确是危险的。

如果您要尝试继续解析,您应该跳过第 1 行,或同时跳过第 1 行和第 2 行。

你添加了这个:

[CSV 文件] 非常大,我必须检查每一行

该程序应该进行检查,而不是您。如果编码正确,程序在执行平凡的重复性任务时会更加可靠。

您可以通过在错误消息中包含行号来更轻松地(手动)更正 CSV 中的错误。但更好的方法是以不允许错误蔓延的方式创建 CSV 文件。

如何以编程方式进行?

使用现有的 Java CSV 阅读器库。有很多可供选择。

【讨论】:

  • 没有。跳过坏行并继续解析。但是当你走到最后时,拒绝整个文件并打印所有错误/行号的列表,以便可以批量更正它们。
  • 事实上,更好的解决方案是在运行 Java 程序之前验证 CSV。
  • OP 显示的数据看起来确实格式错误,除非.. 字段没有被引用(即引号是字段数据的一部分),这也是一个有效的 csv 选项。当然,任何字段都不能包含逗号。但在这种情况下,csv 很可能只是格式错误。
猜你喜欢
  • 2019-01-28
  • 2012-10-22
  • 2022-11-18
  • 1970-01-01
  • 2018-08-01
  • 2015-09-30
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多