2017-01-12 46 views
1

我的问题是:正则表达式从混乱的字符清洁CSV

我使用的一些软件就出来了一个csv,而问题是,这个软件是不是处理CSV如此出色的原因有一些字符串在他们中引用的csv以及包装字符串的内容也被引用,因此我会解析它。

所以这是正常的CSV:

"one","two","three" 

,这里是我的情况:

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

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

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

即时通讯使用的tototoshi库斯卡拉

+0

是否有一个特定的原因,您为什么不使用Python的'csv'包来处理'.csv'文件? –

+0

@WillemVanOnsem即时通讯使用tototoshi for scala,但这些库不能解析它,因为它不是一个正确的格式...如果它是“一个”,“两个”,“三个”没有问题,但它的“一个”,“tw” o“,”three“,所以图书馆不能解析它 – JohnBigs

+0

为什么总是看正则表达式?即使你找到了这个东西,我*认为*看起来可能非常可怕。哎哟:你需要**其他**人甚至想一想,对于你来说,保持**这个正则表达式有多容易?意思是:有时候应该考虑坐下来写他自己的解析器,并明确地做事;而不是抛出怪物的正则表达式。 – GhostCat

回答

1

我试着Python的CSV模块,它是能够做到这一点(听起来像一个黑客,但毕竟输入文件是错误的,并使用正则表达式将是一个黑客太) :

import csv 

z = '''"one","tw"o","three"''' 

cr = csv.reader([z]) 
print(next(cr)) 

结果:

['one', 'two"', 'three'] 

出于某种原因,该帖已经在字符串的结尾移动(把一个双引号在一个领域将是加倍的有效方法) 。

要删除它,你可以做

print([x.replace('"',"") for x in next(cr)]) 

得到

['one', 'two', 'three'] 

注意,因此,如果该帖后面跟一个逗号CSV将发行4场与"one","tw",o","three",实在不行,只有人类验证可以解决此问题。

0

一个可能为你工作很简单的正则表达式的解决办法是这样的:

正则表达式:(?<=\w)"(?=\w) //global flag

取代:'' //blank string

只要我们可以查看“坏”双引号那些包围字母数字,这将工作。这仅仅是对于字母数字,双引号和向字母数字的向前看。它不会匹配双引号和反斜杠或其他双引号,因此""\"会没事。

demo here

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