我的问题是:
我使用的csv来自一些软件,问题是这个软件不能很好地处理csv,因为在csv中有一些字符串包含引号,并且字符串的包装也是引号,所以我在解析它时遇到了问题。
所以这是正常的csv:
"one","two","three"下面是我的案例:
"one","tw"o","three"所以我在解析像"tw"o"这样的字符串时遇到了问题。这基本上是输出文件的软件的问题,我无法编辑该软件。
所以我想我可以创建一个正则表达式,它将接受不必要的引号或逗号,并确保每个字符串都用引号括起来,并用逗号分隔,有人知道我如何实现它吗?
我正在使用scala的tototoshi库
发布于 2017-01-12 21:46:25
我尝试了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将使用"one","tw",o","three"发出4个字段,因此如果引号后面是逗号,则什么都不起作用,只有人工验证可以修复此问题。
发布于 2017-01-12 22:30:17
一个非常简单的正则表达式解决方案可能适用于您:
正则表达式:(?<=\w)"(?=\w) //global flag
替换:'' //blank string
只要我们能看到那些被字母数字括起来的“坏”双引号,它就会起作用。它只是向后查找字母数字、双引号和向前查找字母数字。它不会匹配用反斜杠或另一个双引号转义的双引号,所以""或\"就可以了。
发布于 2017-01-13 15:00:47
看起来您无法预测使用未转义的引号可能会得到什么样的值。没有办法用正则表达式可靠地清理这个问题。
也许可以试试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>);希望能有所帮助。
免责声明:我是这个库的作者。它是开源和免费的(Apachev2.0许可证)
https://stackoverflow.com/questions/41614633
复制相似问题