当前位置: 首页 > 知识库问答 >
问题:

Python-将行拆分为列-csv数据

屈健柏
2023-03-14

正在尝试从csv文件中读取数据,将每行拆分为各自的列。

但是,当某个列本身带有逗号时,我的正则表达式就失败了。

例如:a, b, c,"d, e, g,", f

我想要的结果是:

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

也就是5列。

下面是用逗号分隔字符串的正则表达式am

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

但是它对少数字符串失败,而对其他字符串有效。

我想要的是,当我使用pyspark将csv中的数据读取到数据帧/rdd中时,我希望加载/保留所有列而不出现任何错误

非常感谢。

共有3个答案

姚高韵
2023-03-14

使用regex无法轻松解析CSV文件。

我的从Unix命令行处理CSV的go-to toolkit是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

这是一条走得很好的道路,而且库足够好,您不应该滚动自己的代码。

陈法
2023-03-14

试试看,(?=([^“\]*(\.\.\;”([^“\]*\.)*[^“\]*”)*[^“]*$)。

使用这个答案,它解释了如何匹配所有不在引号中的内容,忽略转义引号并http://regexr.com/进行测试。

请注意,与您的问题状态的其他答案一样,有比使用正则表达式更好的方法来解析CSV。

韦阳辉
2023-03-14

在较新的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']

它支持(*跳过)(*失败)机制,该机制忽略了本例中双引号之间的所有内容

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.

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:""']
 类似资料:
  • 我在csv文件中有一个列,其中包含此格式的人员详细信息: 实际csv格式: 我想将它们拆分为一个新的csv文件,如下所示: 拆分详细信息: 拆分行分隔符:

  • 问题内容: 我设法根据逗号分割了CSV文件。我通过将虚拟字符串放置在有’,’的位置,然后根据虚拟字符串进行拆分来完成此操作。 但是,CSV文件包含以下内容: 因此,在有新行的地方,每行的最后一个值和第一个值合并到自己的字符串中。我该如何解决?我试图将我的虚拟字符串放置在此处,但据此将其拆分,但没有成功。 救命?! 问题答案: 我强烈建议您不要重新发明轮子:)。使用一个已经可用的库来处理CSV文件,

  • 问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue

  • 我有一个数据框架,它有一行和几列。有些列是单个值,有些是列表。所有列表列的长度相同。我想将每个列表列拆分为单独的行,同时保留任何非列表列。 样本DF: 我想要什么: 如果我只有一个列表列,那么只需执行< code>explode就很容易了: 然而,如果我尝试分解<code>c</code>列,我得到的数据帧长度为我想要的平方: 我想要的是-对于每一列,取该列中数组的第n个元素,并将其添加到新行。我

  • 问题内容: 我的问题是我有一个这样的表: c1 | c2 | c3 | c4是一个由|分隔的值。 我的最终结果应如下所示: 我该怎么做呢? 谢谢 问题答案: 这就是您可以执行的操作,使用管道将字符串拆分并使用spark函数爆炸数据 输出: 希望这可以帮助!

  • 问题内容: 我已使用从IMDB收集信息并将其传输到MYSQL数据库的应用程序导入了一些数据。 似乎这些字段尚未标准化,并且在1个字段中包含许多值 例如: 有没有办法将这些值分开,然后将它们插入到另一个表中,而不重复呢? 我进行了一些谷歌搜索,发现我应该使用PHP处理此数据。但是我一点都不了解PHP。 无论如何,仅使用MYSQL即可转换此​​数据? 问题答案: 您可以使用存储过程,该过程使用游标来解