【问题标题】:Regarding Java Split Command CSV File Parsing关于 Java 拆分命令 CSV 文件解析
【发布时间】:2010-02-17 00:26:52
【问题描述】:

我有一个以下格式的 csv 文件。如果程序读取了以下任何一个 csv 数据,我会遇到问题

"D",abc"def,"","0429"292"0","11","IJ80","Feb10_1.txt-2","文件记录","05/02/2010" ,"04/03/2010","","1","-91","",""


"D","abc"def","","04292920","11","IJ80","Feb10_1.txt-2","文件记录","05/02/2010"," 04/03/2010","","1","-91","",""

下面的拆分命令用于忽略双引号内的逗号我从之前的帖子中得到了下面的拆分命令。粘贴了我执行此命令的 URL

字符串项[] = line.split(",(?=([^\"]\"[^\"]\")[^\"] em>$)",15); System.out.println("items.length"+items.length);

Regarding Java Split Command Parsing Csv File

items.length 打印为 14 而不是 15。abc"def 未被识别为单个字段,并且它被错误地存储为 "D",abc"def in items[0]. . 我希望它以下面的方式存储

items[0] 应该是 "D" 并且 items[1] 应该是 abc"def

当有一个值“abc”def“时也会发生同样的问题。我希望它被存储为

items[0] 应该是 "D" 并且 items[1] 应该是 "abc"def"

如果双引号在双引号内重复(字段值为 D,"abc""def",1 ),则此拆分命令也可以完美运行。

我该如何解决这个问题。

【问题讨论】:

  • 这些不是有效的 CSV 行。引号应该被转义。我建议你写一个简单的小解析器并放弃正则表达式。
  • 正如我在您之前的主题中回答的那样:不要使用正则表达式来解析 CSV。这是自找麻烦。 这完全是浪费时间。看我的回答:stackoverflow.com/questions/2241915/…哦,请在这里也使用一个用户帐户。

标签: java string csv split


【解决方案1】:

我认为您最好编写一个解析器来解析 CSV 文件,而不是尝试使用正则表达式。一旦您开始在行内处理带有回车的 CSV 文件,那么 Regex 可能会分崩离析。编写一个遍历所有字符并拆分数据的简单 while 循环不需要那么多代码。当您拥有解析器而不是正则表达式时,处理“非标准”* CSV 文件(例如您的文件)会容易得多。

*我说非标准是因为 CSV 并没有真正的官方标准,当您处理来自许多不同系统的 CSV 文件时,您会看到很多奇怪的东西,例如如图所示的 abc"def 字段以上。

【讨论】:

  • 非常感谢。我打算修改每个字段应该用双引号括起来的文件格式,强制 "A","Field1","Field2","Field3","Fi"el,d","Fi""eld",我希望分隔符组合为“,(双引号后跟,)如何更改以下拆分命令以包含两个分隔符”,(双引号和逗号)一起 line.split(",(?=([^ \"]*\"[^\"]*\")*[^\"]*$)",15);
【解决方案2】:

opencsv 是一个非常简单且轻量级的 Java CSV 解析器。它会轻松处理您的数据。

【讨论】:

    【解决方案3】:

    如果可能,更改 CSV 格式会使解决方案变得非常简单。

    有关分隔符分隔值的概述,请参阅以下内容,这是基于 Unix 的系统上的一种常见格式:

    http://www.faqs.org/docs/artu/ch05s02.html#id2901882

    【讨论】:

    • 非常感谢。我打算修改每个字段应该用双引号括起来的文件格式,强制 "A","Field1","Field2","Field3","Fi"el,d","Fi""eld",我希望分隔符组合为“,(双引号后跟,)如何更改以下拆分命令以包含两个分隔符”,(双引号和逗号)一起 line.split(",(?=([^ \"]*\"[^\"]*\")*[^\"]*$)",15);
    【解决方案4】:

    Opencsv 是非常简单且最好的 CSV 解析 API。这可以通过在 java 中处理它之前使用 Linux SED 命令来完成。如果文件格式不正确,请将其转换为正确的分隔符,即您的 (" , " ) 到管道或其他唯一分隔符,因此 Opencsv 可以轻松区分内部字段值和列分隔符。使用您的 java 代码使用 linux 的强大功能.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多