正则表达式清理csv混乱的字符

时间:2017-01-12 13:36:00

标签: java python regex csv

我的问题是:

我正在使用一些来自某些软件的csv,问题是这个软件没有很好地处理csv因为csv中有一些字符串引用了它们,包装字符串的内容也是引用所以我解决它的问题。

所以这是正常的csv:

"one","two","three"

以下是我的情况:

"one","tw"o","three"

所以我在解析像"tw"o"这样的字符串时遇到了问题。这基本上是输出文件的软件的问题,我无法编辑该软件。

所以我认为我可以创建一个正则表达式,它将使用不必要的引号或逗号,并确保每个字符串都用引号括起并用逗号分隔,有人知道我该如何实现它?

即时通讯使用tototoshi库进行scala

3 个答案:

答案 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

只要我们可以将“坏”双引号视为被字母数字包围的双引号,这将起作用。它只是一个字母数字,双引号和字母数字前瞻的后视图。它与使用反斜杠或其他双引号转义的双引号不匹配,因此""\"可以。

demo here

答案 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许可证)