【问题标题】:Remove New Line from CSV file's string column从 CSV 文件的字符串列中删除新行
【发布时间】:2018-07-29 09:39:56
【问题描述】:

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

【问题讨论】:

  • “即使有些字段跨越多行,我也可以使用 pandas 和 pyspark 毫无问题地读取数据。”那么究竟是什么问题呢?
  • 我想要新的 csv 文件中的数据(已清理),其中多行合并为一行。

标签: python pandas csv pyspark newline


【解决方案1】:

这可能会有所帮助。我正在使用一个简单的 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

【讨论】:

  • 嗨,Rakesh,感谢您提供建议的答案。我更新了问题。可以有 n 个字段,并且此数据跨度可以在任何字段中。您能否提出解决方案。
  • 你能提供一个示例数据吗?
  • 1, "asdsdsdsds", "John",3,4,5,"Hi","This is new line data" 2, "dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjdnf", "Roy",6,7,8,"Hellooo ooooooo ooooooo", "This" 3, "dfjfdkgjfgn", "Rahul",1,2,3,"Hi this is new line data","This is another new line data"
  • 如果跨越多行的字符串包含数字,则每行中的第一个字符应该是数字的假设可能会失败。例如。 1, "some line\n1 plus one equals 2"
【解决方案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"

【讨论】:

  • 不应使用 .split(',') 解析 CSV 文件,因为逗号可能位于带引号的字段中。
  • 你是对的。这是我目前想出的最好的。如果有人发布任何合理的答案,我可能会删除它。
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 2016-11-05
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多