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

dat*_*ict 5 python csv newline pandas pyspark

我有一个包含多个字段的 CSV 文件。数据跨越多行的字段(字符串)很少。我想将这些多行聚合为一行。

输入数据:

1, "asdsdsdsds", "John"
2, "dfdhifdkinf
dfjdfgkdnjgknkdjgndkng
dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"
Run Code Online (Sandbox Code Playgroud)

预期输出:

1, "asdsdsdsds", "John"
2, "dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"
Run Code Online (Sandbox Code Playgroud)

早些时候在SO 中提出了同样的问题。然而,解决方案是使用 power shell 实现的。是否可以使用 python、pandas 或 pyspark 实现相同的目标。

每当数据跨越多行时,它肯定会用双引号引起来。

我试过的

我可以使用 Pandas 和 pyspark 读取数据而不会出现任何问题,即使有些字段跨越了多行。

熊猫:

pandas_df = pd.read_csv("file.csv")
Run Code Online (Sandbox Code Playgroud)

火花

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")
Run Code Online (Sandbox Code Playgroud)

编辑:

csv 文件中可以有 n 个字段,并且此数据跨度可以在任何字段中。

piR*_*red 2

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"
Run Code Online (Sandbox Code Playgroud)

  • 不应使用“.split(',')”来解析 CSV 文件,因为逗号可能位于带引号的字段内。 (2认同)