Python - 将行拆分为列 - csv data

时间:2016-08-09 16:06:55

标签: python regex csv pyspark rdd

我试图从csv文件中读取数据,将每一行拆分为相应的列。

但是当一个特定列的逗号本身时,我的正则表达式失败了。

例如:a,b,c,“d,e,g,”,f

我想要的结果如下:

a    b    c    "d,e, g,"    f  

这是5列。

这是用于通过逗号分割字符串的正则表达式

  

,: “| [+((=(?: ”[^“]的([^],(= ^] )*)????)”:?,)| ,+ | $)

但是当它适用于其他字符串时它会失败。

我正在寻找的是,当我使用pyspark从csv读取数据到dataframe / rdd时,我想加载/保留所有列而不会出现任何错误

谢谢

3 个答案:

答案 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 quoteshttp://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的广泛讨论:

https://softwareengineering.stackexchange.com/questions/166454/can-the-csv-format-be-defined-by-a-regex

这是一条很好的路径,而且这些库非常好,你不应该自己编写代码。