我试图从csv文件中读取数据,将每一行拆分为相应的列。
但是当一个特定列的逗号本身时,我的正则表达式失败了。
例如:a,b,c,“d,e,g,”,f
我想要的结果如下:
a b c "d,e, g," f
这是5列。
这是用于通过逗号分割字符串的正则表达式
,: “| [+((=(?: ”[^“]的([^],(= ^] )*)????)”:?,)| ,+ | $)
但是当它适用于其他字符串时它会失败。
我正在寻找的是,当我使用pyspark从csv读取数据到dataframe / rdd时,我想加载/保留所有列而不会出现任何错误
谢谢
答案 0 :(得分:3)
在较新的regex
模块的帮助下更容易:
import regex as re
string = 'a,b,c,"d,e, g,",f'
rx = re.compile(r'"[^"]*"(*SKIP)(*FAIL)|,')
parts = rx.split(string)
print(parts)
# ['a', 'b', 'c', '"d,e, g,"', 'f']
它支持(*SKIP)(*FAIL)
机制,它忽略了本例中双引号之外的所有内容
import regex as re
string = '''a,b,c,"d,e, g,",f, this, one, with "escaped \"double",quotes:""'''
rx = re.compile(r'".*?(?<!\\)"(*SKIP)(*FAIL)|,')
parts = rx.split(string)
print(parts)
# ['a', 'b', 'c', '"d,e, g,"', 'f', ' this', ' one', ' with "escaped "double",quotes:""']
在regex101.com上查看后者的演示。
<小时/> 对于近50分,我觉得也提供csv
方法:
import csv
string = '''a,b,c,"d,e, g,",f, this, one, with "escaped \"double",quotes:""'''
# just make up an iterable, normally a file would go here
for row in csv.reader([string]):
print(row)
# ['a', 'b', 'c', 'd,e, g,', 'f', ' this', ' one', ' with "escaped "double"', 'quotes:""']
答案 1 :(得分:3)
尝试\,(?=([^"\\]*(\\.|"([^"\\]*\\.)*[^"\\]*"))*[^"]*$)
。
使用this answer which explains how to match everything that is not in quotes ignoring escaped quotes和http://regexr.com/进行测试。
请注意 - 作为问题状态的其他答案 - 有更好的方法来解析CSV而不是使用正则表达式。
答案 2 :(得分:3)
您无法使用正则表达式轻松解析CSV文件。
我从Unix命令行处理CSV的首选工具包是csvkit
,您可以从https://csvkit.readthedocs.io获取。它也有一个Python库。
标准csv库的Python文档位于:https://docs.python.org/2/library/csv.html
这里有一个解析CSV的广泛讨论:
这是一条很好的路径,而且这些库非常好,你不应该自己编写代码。