我有很多带文本限定符的分隔文件(每列开头和结尾都有双引号)。定界不一致,即可以有任何分隔,如逗号(,),管道(|),〜,制表符(\ t)。
我需要使用spark.read.textFile
(单列)读取此文件,然后使用双引号删除文本限定符以及分隔符(需要用空格替换分隔符)。在这里我想要考虑列,即我不应该分成列
下面是3列ID,名称和DESC的测试数据。 DESC列有额外的分隔符。
val y = """4 , "XAA" , "sf,sd\nsdfsf""""
val pattern = """"[^"]*(?:""[^"]*)*"""".r
val output = pattern replaceAllIn (y, m => m.group(0).replaceAll("[,\n]", " "))
我上面的代码适用于静态值。但我无法申请DF。
" ID""名称"" DESC"
" 1" ," ABC"," A,B C"
" 2" ," XYZ" ," ABC很烦恼"
" 3" ," YYZ" ," FER" sfsf,sfd f"
4," XAA" ," sf,sd sdfsf"
我需要输出
ID,名称,DESC
1,ABC,A B C
2,XYZ,ABC很麻烦 3,YYZ,FER" sfsf sfd f
4,XAA,sf sd sdfsf
先谢谢。
解决
var SourceFile = spark.read.textFile("/data/test.csv")
val SourceFileDF= SourceFile.withColumn("value", RemoveQualifier(col("value")))
def RemoveQualifier = udf((RawData:String)=>
{
var Data = RawData
val pattern = """"[^"]*(?:""[^"]*)*"""".r
Data = pattern replaceAllIn (Data , m => m.group(0).replaceAll("[,]", " "))
Data
})
感谢。
答案 0 :(得分:0)
你可以像这样使用两个replaceAll():
val output = pattern replaceAllIn (y, m => m.group(0).replaceAll("[,\\\\n]", " ").replaceAll("\"|\"", ""))
输出:String = 4,XAA,sf sd sdfsf