【问题标题】:Parsing CSV file where encapsulator in content ain't escaped properly解析内容中的封装器未正确转义的 CSV 文件
【发布时间】:2017-05-16 09:59:52
【问题描述】:

您好,我有一个 CSV 文件,其中封装字符未正确转义。

例子

uerf@einf.erf,"uhrege gerjhhg er<span style="background-color: rgb(0,153,0);">eriueiru kernger</span><font color="#009900"><span style="background-color: rgb(255,255,255);"> weiufhuweifbw fhew fibwefbw</span></font><div><font color="#009900"><span style="background-color: rgb(255,255,255);">wekifbwe fewf</span></font></div><div><font color="#009900"><span style="background-color: rgb(255,255,255);">weiuifgewbfjew f</span></font></div>",18-Oct-2016,

分隔符 -> ,

封装器 -> "

当我尝试使用 commons-csv reader 阅读时,它会中断, 抛出“invalid char between encapsulated token and delimiter”异常。

但是 Microsoft excel 似乎可以完美地打开文件。 关于如何处理的任何想法? .

如何解析封装器未正确转义的 CSV 文件?Excel 似乎可以正常打开此类文件。

【问题讨论】:

标签: java excel apache csv apache-commons


【解决方案1】:

如果您无法从源头解决此问题(即生成格式良好的 csv),并且您想自己解析此问题,则可以采用简单的方法:

将 field1 扫描到 ," - field2 到 ", - 其余为 field3(尾随逗号?)。

当然,如果在 html 字段中出现",,那就有问题了。您可以通过首先扫描到 ,",然后向后(从行尾开始)扫描到 ", 来解决这个问题。

如果字段多于您在此处显示的字段,您可以查找 ," 的组合(两种组合,也可以是 ",")并希望这些字段不会出现在字段数据中。

【讨论】:

    【解决方案2】:

    univocity-parsers 有一个 CSV 解析器,可以正确处理此类输入。

        //first configure the parser
        CsvParserSettings settings = new CsvParserSettings();
        settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);
    
        //then create a parser and parse your input line:
        CsvParser parser = new CsvParser(settings);
        String[] result = parser.parseLine("" +
                "uerf@einf.erf,\"uhrege gerjhhg er<span style=\"background-color: rgb(0,153,0);\">eriueiru kernger</span><font color=\"#009900\"><span style=\"background-color: rgb(255,255,255);\"> weiufhuweifbw fhew fibwefbw</span></font><div><font color=\"#009900\"><span style=\"background-color: rgb(255,255,255);\">wekifbwe fewf</span></font></div><div><font color=\"#009900\"><span style=\"background-color: rgb(255,255,255);\">weiuifgewbfjew f</span></font></div>\",18-Oct-2016,");
    
        //here's the result (one value per line)
        for (String v : result) {
            System.out.println(v);
        }
    

    打印出来:

    uerf@einf.erf
    uhrege gerjhhg er<span style="background-color: rgb(0,153,0);">eriueiru kernger</span><font color="#009900"><span style="background-color: rgb(255,255,255);"> weiufhuweifbw fhew fibwefbw</span></font><div><font color="#009900"><span style="background-color: rgb(255,255,255);">wekifbwe fewf</span></font></div><div><font color="#009900"><span style="background-color: rgb(255,255,255);">weiuifgewbfjew f</span></font></div>
    18-Oct-2016
    null
    

    希望对你有帮助。

    免责声明:我是这个库的作者。它是开源和免费的(Apache v2.0 许可证)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2016-11-25
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多