我有一个包含多个字段的CSV文件。数据跨越多行的字段(字符串)很少。我想将这些多行聚合成一行。
输入数据:
1, "asdsdsdsds", "John"
2, "dfdhifdkinf
dfjdfgkdnjgknkdjgndkng
dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"
预期输出:
1, "asdsdsdsds", "John"
2, "dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"
早先在SO中提出同样的问题。然而,使用电源壳实现了该解决方案。是否可以使用python或pandas或pyspark实现相同的目的。
每当数据跨越多行时,肯定是双引号。
我尝试了什么
我可以使用pandas和pyspark读取数据而不会出现任何问题,即使有些字段跨越多行。
熊猫:
pandas_df = pd.read_csv("file.csv")
PySpark
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true') \
.option("delimiter", ",").option("escape", '\\').option("escape", ':').\
option("parserLib", "univocity").option("multiLine", "true").load("file.csv")
修改
csv文件中可以有n个字段,这个数据范围可以在任何字段中。
答案 0 :(得分:1)
def weird_gen(s):
s = [s]
while s:
*x, a = s[0].split(',', 2)
y, *s = a.split('\n', 1)
yield ', '.join(z.strip().replace('\n', ' ') for z in x + [y])
print('\n'.join(weird_gen(open('bad.csv').read())))
1, "asdsdsdsds", "John"
2, "dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"
答案 1 :(得分:0)
这可能会有所帮助。我使用简单的for循环和负索引来获得所需的结果。
s = """1, "asdsdsdsds", "John"
2, "dfdhifdkinf
dfjdfgkdnjgknkdjgndkng
dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"""
res = []
for i in s.split("\n"):
if i[0].isdigit():
res.append(i)
else:
res[-1] = res[-1] + " " + I
for i in res:
print(i)
<强>输出强>:
1, "asdsdsdsds", "John"
2, "dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul