如何解析带有换行符的文件,用 \ 转义而不用引号引起来
How to parse a file with newline character, escaped with \ and not quoted
我在读取和解析 CSV 文件时遇到问题。一些记录有一个换行符,"escaped" 由一个 \,并且该记录没有被引用。该文件可能如下所示:
Line1field1;Line1field2.1 \
Line1field2.2;Line1field3;
Line2FIeld1;Line2field2;Line2field3;
我尝试使用 sc.textFile("file.csv")
和 sqlContext.read.format("..databricks..").option("escape/delimiter/...").load("file.csv")
阅读它
然而不管我怎么读它,一个 record/line/row 是在 "\\n" si 到达时创建的。因此,我得到的不是前一个文件中的 2 条记录,而是 3 条:
[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)
(换行符如何保存在记录中并不重要,主要问题是records/lines的正确设置)
关于如何做到这一点的任何想法?不修改原始文件,最好不进行任何 post/re 处理(例如读取文件并过滤字段数少于预期的任何行,并将它们连接起来可能是一个解决方案,但根本不是最佳的)
我希望使用 databrick 的 csv 解析器将转义字符设置为 \(默认情况下应该是),但这没有用[得到一个错误提示
java.io.IOException: EOF whilst processing escape sequence
].
我是否应该以某种方式扩展解析器并编辑一些内容,创建我自己的解析器?哪个是最好的解决方案?
谢谢!
编辑:忘了说了,我用的是 spark 1.6
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]
我在读取和解析 CSV 文件时遇到问题。一些记录有一个换行符,"escaped" 由一个 \,并且该记录没有被引用。该文件可能如下所示:
Line1field1;Line1field2.1 \
Line1field2.2;Line1field3;
Line2FIeld1;Line2field2;Line2field3;
我尝试使用 sc.textFile("file.csv")
和 sqlContext.read.format("..databricks..").option("escape/delimiter/...").load("file.csv")
然而不管我怎么读它,一个 record/line/row 是在 "\\n" si 到达时创建的。因此,我得到的不是前一个文件中的 2 条记录,而是 3 条:
[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)
(换行符如何保存在记录中并不重要,主要问题是records/lines的正确设置)
关于如何做到这一点的任何想法?不修改原始文件,最好不进行任何 post/re 处理(例如读取文件并过滤字段数少于预期的任何行,并将它们连接起来可能是一个解决方案,但根本不是最佳的)
我希望使用 databrick 的 csv 解析器将转义字符设置为 \(默认情况下应该是),但这没有用[得到一个错误提示
java.io.IOException: EOF whilst processing escape sequence
].
我是否应该以某种方式扩展解析器并编辑一些内容,创建我自己的解析器?哪个是最好的解决方案?
谢谢!
编辑:忘了说了,我用的是 spark 1.6
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]