python - 从 CSV 文件中删除新行

标签 python csv apache-spark newline

我想删除 CSV 文件字段数据中的换行符。 SO/其他地方的多人问了同样的问题。但是,提供的解决方案是在脚本中。我正在寻找使用 PYTHON 或 Spark(不仅是这两个)等编程语言的解决方案,因为我有相当大的文件。

以前就同一主题提出的问题:

我有一个大小为 ~1GB 的 CSV 文件,我想删除字段数据中的换行符。 CSV 文件的架构动态变化,因此我无法对架构进行硬编码。换行符并不总是出现在逗号之前,它甚至会随机出现在一个字段中。

示例数据:

playerID,yearID,gameNum,gameName,teamName,lgID,GP,startingPos
gomezle01,1933,1,Cricket,Team1,NYA,AL,1
ferreri01,1933,2,Hockey,"This is 
Team2",BOS,AL,1
gehrilo01,1933,3,"Game name is 
Cricket" 
,Team3,NYA,AL,1
gehrich01,1933,4,Hockey,"Here it is 
Team4",DET,AL,1
dykesji01,1933,5,"Game name is 
Hockey"
,"Team name 
Team5",CHA,AL,1

预期输出:

playerID,yearID,gameNum,gameName,teamName,lgID,GP,startingPos
gomezle01,1933,1,Cricket,Team1,NYA,AL,1
ferreri01,1933,2,Hockey,"This is Team2",BOS,AL,1
gehrilo01,1933,3,"Game name is Cricket" ,Team3,NYA,AL,1
gehrich01,1933,4,Hockey,"Here it is Team4",DET,AL,1
dykesji01,1933,5,"Game name is Hockey","Team name Team5",CHA,AL,1

换行符可以出现在任何字段的数据中。

编辑: 根据代码截图:

enter image description here

最佳答案

如果您正在使用 pyspark 那么我建议您使用 sparkContextwholeTextFiles 函数来读取文件,因为您的文件需要作为完整的文本来读取以进行适当的解析

使用 wholeTextFiles 阅读后,您应该通过将行尾字符替换为 来进行解析,并进行一些额外的格式化,以便将整个文本分解为八个字符串的组。

import re
rdd = sc.wholeTextFiles("path to your csv file")\
    .map(lambda x: re.sub(r'(?!(([^"]*"){2})*[^"]*$),', ' ', x[1].replace("\r\n", ",").replace(",,", ",")).split(","))\
    .flatMap(lambda x: [x[k:k+8] for k in range(0, len(x), 8)])

你应该得到输出为

[u'playerID', u'yearID', u'gameNum', u'gameName', u'teamName', u'lgID', u'GP', u'startingPos']
[u'gomezle01', u'1933', u'1', u'Cricket', u'Team1', u'NYA', u'AL', u'1']
[u'ferreri01', u'1933', u'2', u'Hockey', u'"This is Team2"', u'BOS', u'AL', u'1']
[u'gehrilo01', u'1933', u'3', u'"Game name is Cricket"', u'Team3', u'NYA', u'AL', u'1']
[u'gehrich01', u'1933', u'4', u'Hockey', u'"Here it is Team4"', u'DET', u'AL', u'1']
[u'dykesji01', u'1933', u'5', u'"Game name is Hockey"', u'"Team name Team5"', u'CHA', u'AL', u'1']

如果您想将所有数组 rdd 行转换为行字符串,那么您可以添加

.map(lambda x: ", ".join(x))

你应该得到

playerID, yearID, gameNum, gameName, teamName, lgID, GP, startingPos
gomezle01, 1933, 1, Cricket, Team1, NYA, AL, 1
ferreri01, 1933, 2, Hockey, "This is Team2", BOS, AL, 1
gehrilo01, 1933, 3, "Game name is Cricket", Team3, NYA, AL, 1
gehrich01, 1933, 4, Hockey, "Here it is Team4", DET, AL, 1
dykesji01, 1933, 5, "Game name is Hockey", "Team name Team5", CHA, AL, 1

关于python - 从 CSV 文件中删除新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48970822/

相关文章:

apache-spark - pyspark ml错误-u'要求失败: Cannot have an empty string for name'

python - 将 SHAP 瀑布图导出到数据框

python - 如何在图像菜单项中使用自定义图标?

python - kubernetes python 客户端中的 kubectl cp

python - Web Scraper 未填充 .csv 文件

apache-spark - 使用PySpark将数据从HDFS索引到Elastic Search

python - 如何使用Keras TimeseriesGenerator为每n个训练样本获取一个验证样本?

csv - 雅虎!财务 CSV 文件不会返回道琼斯 (^DJI)

python - 如何解析多个xml文件并将属性传递给csv?

apache-spark - 在 apache spark 的从机上生成输出文件