在CSV行的结尾处找到未终止的带引号的字段

时间:2018-07-21 14:18:16

标签: java csv import deeplearning4j

无论如何,我们是否可以找到“ CSV行结尾的带引号的未终止字段”的行号?我正在尝试用Java读取CSV文件,但最有可能出错是因为-有一个引号已打开但没有关闭。 我正在使用deeplearning4j的CSVRecordReader-datavec。

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

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

4 个答案:

答案 0 :(得分:2)

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

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

您可以使用任何所需的记录读取器。您不必使用我们提供的内容。这些组件仅在接口级别耦合。

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

无论哪种方式,这里都有一个解决方案的多个选项。如果您对可用性有特殊建议,也非常欢迎提交问题:https://github.com/deeplearning4j/deeplearning4j/issues

答案 1 :(得分:1)

下面是一种确定特定字符的数量是否为奇数的方法。

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个'

答案 2 :(得分:1)

univocity-parsers处理未转义的引号,您可以对其进行配置以引发异常(如果发现任何异常)。该异常将打印出文件中的字符位置,行以及查找问题根源所需的所有内容。

只需使用:

settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.RAISE_ERROR);

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

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

希望有帮助。

披露:我是这个图书馆的作者。它是开源且免费的(Apache 2.0许可证)

答案 3 :(得分:0)

您甚至不需要编写任何程序,只需 Notepad ++

使用 Notepad ++ 打开文件,按Ctrl-F并指定 搜索模式作为正则表达式

查找内容字段中输入,"[^"\n]*\n。此正则表达式查找:

  • ,"-逗号和双引号。
  • [^"\n]*-除双引号或换行符以外的一系列字符。
  • \n-换行符,终止此行。

然后点击查找下一个。假设您打开了行号,您将 查看“违规”行的编号。