无论如何,我们是否可以找到“ CSV行结尾的带引号的未终止字段”的行号?我正在尝试用Java读取CSV文件,但最有可能出错是因为-有一个引号已打开但没有关闭。 我正在使用deeplearning4j的CSVRecordReader-datavec。
这个想法是,如果我找到该行号,则可以删除/更正它。但是问题是,抛出错误时我找不到行号。
如果您有任何建议-使用Java或其他语言,请告诉我。谢谢!
答案 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
-换行符,终止此行。然后点击查找下一个。假设您打开了行号,您将 查看“违规”行的编号。