如何根据特定模式拆分CSV行

时间:2013-05-17 10:27:15

标签: regex string csv split

在.csv文件中,我有如下行:

10,"nikhil,khandare","sachin","rahul",viru  

我想用逗号(,)分割线。但是,我不想在双引号之间拆分单词("")。如果我使用逗号分割,我将获得包含以下项目的数组:

10  
nikhil  
khandare  
sachin  
rahul  
viru  

但我不希望双引号之间的项目用逗号分隔。我想要的结果是:

10
nikhil,khandare
sachin
rahul
viru

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

用于分隔字段的字符不应出现在字段本身中。如果可能,请将,替换为;以分隔csv文件中的字段,这样可以让您的生活更轻松。但是,如果您坚持使用,作为分隔符,则可以使用此正则表达式拆分每一行:

/((?:[^,"]|"[^"]*")+)/

例如,在Python中:

import re
s = '10,"nikhil,khandare","sachin","rahul",viru'
re.split(r'((?:[^,"]|"[^"]*")+)', s)[1::2]
=> ['10', '"nikhil,khandare"', '"sachin"', '"rahul"', 'viru']

现在要获得问题中显示的完全结果,我们只需删除那些额外的"字符:

[e.strip('" ') for e in re.split(r'((?:[^,"]|"[^"]*")+)', s)[1::2]]
=> ['10', 'nikhil,khandare', 'sachin', 'rahul', 'viru']

答案 1 :(得分:1)

如果你真的总是有这么简单的结构,你可以在丢弃第一个数字和逗号后使用“,”(是的,带引号)拆分

如果不是,您可以使用一种非常简单的state machine形式从左到右解析您的输入。您将有两种状态:内部报价和外部报价。正则表达式也是一种好的(并且更简单)方式,如果你已经知道它们(因为它们基本上相当于状态机,只是另一种形式)