【问题标题】:unable to parse csv if contains " "如果包含“”,则无法解析 csv
【发布时间】:2014-10-28 18:25:45
【问题描述】:

我有一个具有以下值的 csv 文件:

10~30~"映射~~值"~40~50

当我尝试用分隔符解析这个 csv 时 ~

我得到的值如下:

10,30,mapping, ,values,40,50

但实际结果应该是这样的:

10,30,mapping~~values,40,50(当任何东西用双引号括起来时,它应该取总值)

谁能在这方面帮助我。

【问题讨论】:

  • 不要重新发明轮子,使用轻量级和高性能的 opencsv 库。
  • 你用什么来解析 csv?
  • 下面是我使用的代码 String line = null; BufferedReader bufferedReader = new BufferedReader(new FileReader( csvFilePath)); while ((line = bufferedReader.readLine()) != null) { line = line.toString(); csvRecords.add(Arrays.asList(line.split(delimiter))); }
  • 你为什么不使用第一个 " 分割线作为分隔符并将每个元素添加到字符串数组中,比如说 A,然后循环 A 并验证字符串是否不包含~~ 所以像分隔符一样使用 ~ 拆分它,然后将每个元素添加到数组 B 中,否则如果来自 A 的字符串包含 ~~ 然后将其添加到 B
  • 通过编辑而不是添加 cmets 来澄清您的问题。

标签: java csv


【解决方案1】:

虽然 CSV 文件看起来很简单,但它们非常复杂,因为它们需要处理分隔符是值的一部分的情况(使用您在案例中观察到的引号),甚至当引号出现在字符串中时(通常编码为双精度引号)。因此,一个简单的 String.split 不足以解析 CSV 文件。 有几个提供 CSV 阅读器的库,请使用其中之一。示例是上面提到的 openCSV,或者来自 Apache 的那个:http://commons.apache.org/proper/commons-csv/

【讨论】:

    【解决方案2】:

    试试这个。

    假设 line 是 CSV 文件中的一行。以下代码会将其正确拆分为项目:

    String[] items = line.trim().split(',(?=([^\"]*\"[^\"]*\")*[^\"]*$)')
    

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多