如何使用换行符解析文件,使用\进行转义而不引用

时间:2017-11-06 07:17:22

标签: scala csv parsing apache-spark databricks

在阅读和解析CSV文件时,我遇到了一个问题。有些记录有换行符号,"转义"通过\,并且该记录未被引用。该文件可能如下所示:

Line1field1;Line1field2.1 \
Line1field2.2;Line1field3;
Line2FIeld1;Line2field2;Line2field3;

我尝试使用sc.textFile("file.csv")并使用sqlContext.read.format("..databricks..").option("escape/delimiter/...").load("file.csv")

阅读

然而,无论我如何阅读它,都会在" \ \ n"时创建记录/行/行。达到了。所以,我没有从前一个文件中获得2条记录,而是获得了三条记录:

[Line1field1,Line1field2.1,null] (3 fields)
[Line1field.2,Line1field3,null] (3 fields)
[Line2FIeld1,Line2field2,Line2field3;] (3 fields)

预期结果是:

[Line1field1,Line1field2.1 Line1field.2,Line1field3] (3 fields)
[Line2FIeld1,Line2field2,Line2field3] (3 fields)

(新行符号如何保存在记录中并不重要,主要问题是拥有正确的记录/行集)

有关如何做到这一点的任何想法?无需修改原始文件,最好不进行任何后期/重新处理(例如,读取文件并过滤字段数少于预期的任何行,并且连接它们可能是一种解决方案,但根本不是最优的)

我希望使用databrick的csv解析器将转义字符设置为\(默认情况下应该是这样),但是没有用[发生了错误说法]  java.io.IOException: EOF whilst processing escape sequence]。

我应该以某种方式扩展解析器并编辑一些东西,创建我自己的解析器吗?哪个是最好的解决方案?

谢谢!

编辑:忘记提及,我使用的是火花1.6

1 个答案:

答案 0 :(得分:1)

在您的情况下,

wholeTextFiles api应该是救援者api。它将文件读取为键,值对:键作为文件的路径,值作为文件的整个文本。您将不得不进行一些替换和拆分以获得所需的输出

val rdd = sparkSession.sparkContext.wholeTextFiles("path to the file")
                .flatMap(x => x._2.replace("\\\n", "").replace(";\n", "\n").split("\n"))
                .map(x => x.split(";"))

rdd输出

[Line1field1,Line1field2.1 Line1field2.2,Line1field3]
[Line2FIeld1,Line2field2,Line2field3]