【问题标题】:reading csv file enclosed in double quote but with newline读取用双引号括起来但带有换行符的csv文件
【发布时间】:2026-02-12 16:45:02
【问题描述】:

我有csv,列中有换行符。以下是我的示例:

"A","B","C"
1,"This is csv with 
newline","This is another column"
"This is newline
and another line","apple","cat"

我可以在 spark 中读取文件,但列内的换行符被视为单独的行。

如何将其准备为 csv,并将文本包含在双引号内。

我只使用 apache csv 插件和 apache 读取文件。

alarms = sc.textFile("D:\Dataset\oneday\oneday.csv")

这给了我 RDD :

**example.take(5)**

[u'A,B,C', u'1,"This is csv with ', u'newline",This is another column', u'"This is newline', u'and another line",apple,cat']

Spark 版本:1.4

【问题讨论】:

  • line.replace('/n','') if line.count('"')%2==1 and '"\n' not in line

标签: python python-2.7 apache-spark pyspark


【解决方案1】:

标准 python 库中的 csv 模块开箱即用:

>>> txt = '''"A","B","C"
1,"This is csv with 
newline","This is another column"
"This is newline
and another line","apple","cat"'''
>>> import csv
>>> import io
>>> with io.BytesIO(txt) as fd:
    rd = csv.reader(fd)
    for row in rd:
        print row


['A', 'B', 'C']
['1', 'This is csv with \nnewline', 'This is another column']
['This is newline\nand another line', 'apple', 'cat']

这可以与binaryFiles 一起使用(与textFile 相比有显着的性能损失):

>>> (sc.binaryFiles(path)
        .values()
        .flatMap(lambda x: csv.reader(io.BytesIO(x))))

【讨论】:

  • @zero323:感谢您改进我的回答。我很了解 csv 模块,但我不能对 spark 说同样的话......
【解决方案2】:

您不需要导入任何内容。下面提出的解决方案创建第二个文件仅用于演示目的。您可以在修改后读取该行,而无需将其写入任何地方。

with open(r'C:\Users\evkouni\Desktop\test_in.csv', 'r') as fin:
    with open(r'C:\Users\evkouni\Desktop\test_out.csv', 'w') as fout:
        cont = fin.readlines()
        for line in cont[:-1]:
            if line.count('"') % 2 == 1 and '"\n' not in line:
                line = line.replace('\n', '')
            fout.write(line)

#DEMO

#test_in.csv
#------------
#"A";"B";"C"
#1;"This is csv with 
#newline";"This is another column"
#"This is newline

#test_out.csv
#------------
#"A";"B";"C"
#1;"This is csv with newline";"This is another column"
#"This is newline

如果您有不清楚的地方,请告诉我。

【讨论】:

  • 虽然一般来说这是一个很好的答案,但它并没有真正解决特定的上下文。
  • @zero323 这是什么意思?
  • @zero323 OP 没有说他在 spark 中读取 csvs 时遇到问题。他的问题是列条目中的换行符。虽然我对 spark 不熟悉,但我仍然不明白你的意思。
  • 您将如何在 Spark 中使用?特别是您必须使用分布式数据而不是可迭代的数据结构。可以以与@SergeBallesta 编写的代码类似的方式进行调整,但这远不是一个有效的解决方案。
  • @zero323 只是为了让我们停止追逐我们的尾巴.. 你能引用 OP 你在说什么吗?
【解决方案3】:

如果您想使用换行符从 csv 创建数据帧并用双引号引用而不重新发明*,请使用 spark-csv 和 common-csv 库:

from pyspark.sql import SQLContext
df = sqlContext.load(header="true",source="com.databricks.spark.csv", path = "hdfs://analytics.com.np:8020/hdp/badcsv.csv")

【讨论】:

  • Commons 的 CSV 解析器将在换行符上失败,不是吗?你的意思是单义性吗?
  • @zero323 你需要加载 spark-csv 否则如果你使用 common-csv 会失败。
  • 这不是我的意思。 commons parser 据我记得不处理多行记录。 univocity 确实如此。两者都使用spark-csv,尽管这在 2.0+ 中或多或少地被弃用了
  • @zero323 我使用的是 spark 1.4。是的,我无法用 commons 完成它。你指的是谁的2.0+版本? spark-csv 被贬低了吗? github.com/databricks/spark-csv 。另外,我找不到它是否被贬低!使用这个有任何性能损失吗?
  • Spark 2.0+。没有任何惩罚,它只是在核心库中提供 csv 支持。
最近更新 更多