我的问题是:
我正在使用一些来自某些软件的csv,问题是这个软件没有很好地处理csv因为csv中有一些字符串引用了它们,包装字符串的内容也是引用所以我解决它的问题。
所以这是正常的csv:
"one","two","three"
以下是我的情况:
"one","tw"o","three"
所以我在解析像"tw"o"
这样的字符串时遇到了问题。这基本上是输出文件的软件的问题,我无法编辑该软件。
所以我认为我可以创建一个正则表达式,它将使用不必要的引号或逗号,并确保每个字符串都用引号括起并用逗号分隔,有人知道我该如何实现它?
即时通讯使用tototoshi库进行scala
答案 0 :(得分:1)
我尝试了Python csv模块,它能够做到这一点(听起来像黑客但输入文件毕竟是错误的,使用正则表达式也是一种黑客攻击):
['one', 'two"', 'three']
结果:
print([x.replace('"',"") for x in next(cr)])
出于某种原因,引号已在字符串的末尾移动(在字段中放置双引号的有效方法是将其加倍)。
要删除它,您可以
['one', 'two', 'three']
获取
"one","tw",o","three"
请注意,csv将使用{{1}}发出4个字段,因此如果引号后跟逗号,则无效,只有人工验证才能解决此问题。
答案 1 :(得分:0)
可能对您有用的一个非常简单的正则表达式解决方案是:
正则表达式:(?<=\w)"(?=\w) //global flag
替换:'' //blank string
只要我们可以将“坏”双引号视为被字母数字包围的双引号,这将起作用。它只是一个字母数字,双引号和字母数字前瞻的后视图。它与使用反斜杠或其他双引号转义的双引号不匹配,因此""
或\"
可以。
答案 2 :(得分:0)
看起来您无法预测可能获得未转义报价的价值类型。用正则表达式无法可靠地清理它。
也许尝试univocity-parsers因为它有一个可以正确处理这种输入的CSV解析器。例如:
//first configure the parser
CsvParserSettings settings = new CsvParserSettings();
//override the default unescape quote handling. This seems more appropriate for your case.
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);
//then create a parser and parse your input line:
CsvParser parser = new CsvParser(settings);
List<String[]> results = parser.parseAll(<your input here>);
希望它有所帮助。
免责声明:我是这个图书馆的作者。它是开源和免费的(Apache v2.0许可证)