【问题标题】:Finding Un-terminated quoted field at end of CSV line在 CSV 行末尾查找未终止的引用字段
【发布时间】:2018-12-29 14:43:43
【问题描述】:

我们是否可以找到“CSV 行末尾未终止的引用字段”的行号?我正在尝试在 java 中读取 CSV 文件,但最可能是因为出现错误 - 有一个报价已打开但未关闭。 我正在使用 deeplearning4j 的 CSVRecordReader - datavec。

这个想法是,如果我找到该行号,我可以删除/更正它。但问题是,抛出错误时我找不到行号。

如果您对 Java 或其他语言有任何建议,请告诉我。谢谢!

【问题讨论】:

  • 如果要查找包含奇数引号的行,只需计算引号即可。
  • 我是这么认为的,但是如果我们有一个转义的报价呢?
  • 如果你知道转义字符,你可以省略转义字符后面的引号。
  • 或者你可以使用另一个 csv 库。我相信有些库可以检测到错误。
  • 谢谢!我可以使用其他库,但该库提供了许多其他功能,并且紧密集成。我需要和那个图书馆一起生活。因此,我必须更正/删除文件....

标签: java csv import deeplearning4j


【解决方案1】:

对于 datavec,我会考虑使用调试器。 您可以轻松地在https://github.com/deeplearning4j/deeplearning4j/blob/master/datavec/datavec-api/src/main/java/org/datavec/api/records/reader/impl/csv/CSVRecordReader.java#L181 上设置断点,然后查看它无法解析文件的位置。

您也可以只编写自己的记录阅读器。建议替代 csv 库的人没有完整的上下文,所以让我将其重定向到该库的适当解决方案:您说它是紧密集成的,但您实际上误解了它的耦合位置 在哪里 .

您可以使用任何您想要的记录阅读器。您不必使用我们提供的那些。组件仅在接口级别耦合。

对于您的特定 csv 问题,您也可以只清理 csv 文件。我的解决方案专注于尝试在您的 ide 中对其进行调试。

无论哪种方式,您都有多种解决方案可供选择。如果您对可用性有特别的建议,也非常欢迎您提出问题:https://github.com/deeplearning4j/deeplearning4j/issues

【讨论】:

    【解决方案2】:

    以下是判断特定字符个数是否为奇数的方法。

    static boolean oddChar(char escape, char target, String line) {
        int cnt = 0;
        for (int i = 0; i < line.length(); i++) {
            while (i < line.length() && line.charAt(i) == escape)
                i += 2;
            if (i < line.length() && line.charAt(i) == target)
                cnt++;
        }
        return (cnt & 1) == 1;
    }
    

    例如

    oddChar('/', '\'', "shsb'jddn'sjs/'nddn////'bdbd///'");
    

    有 3 个'

    【讨论】:

      【解决方案3】:

      univocity-parsers 处理非转义引号,您可以将其配置为在发现异常时引发异常。异常将打印出文件中的字符位置、行以及查找问题根源所需的所有内容。

      只需使用:

      settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.RAISE_ERROR);

      您还可以使用RowProcessor 中的ParsingContext 对象中的方法currentParsedContent。这将返回用于生成单个记录的整个 String。如果将这些写入输出文件,最终将重新生成输入 CSV。

      您可以利用它来定位有问题的未转义引号的位置并修复文件,以便您可以将其输入回您当前使用的库。

      希望对你有帮助。

      披露:我是这个库的作者。它是开源和免费的(Apache 2.0 许可证)

      【讨论】:

        猜你喜欢
        • 2011-06-25
        • 2022-12-15
        • 2022-01-17
        • 1970-01-01
        • 2018-04-15
        • 2020-08-23
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        相关资源
        最近更新 更多