从CSV文件的字符串列中删除新行

时间:2018-02-19 07:30:03

标签: python pandas csv pyspark newline

我有一个包含多个字段的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个字段,这个数据范围可以在任何字段中。

2 个答案:

答案 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