2017-10-05 55 views
0

我有很多具有文本限定符的分隔文件(每列開始和結尾都有雙引號)。分隔符不一致,即可以有任何分隔符,如逗號(,),管道(|),〜,選項卡(\ t)。如何用Scala中的TextQualifier文件的雙引號刪除雙引號和額外分隔符

我需要使用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,BC」
「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("\"|\"", ""))

輸出:字符串= 4,XAA,SF SD sdfsf

+0

我解決了,使用類似的代碼使用udf。 – Raghunath

+0

需要一件事我不想刪除雙引號中的雙引號EX:5,「TES」,「SFSFSF」sdfsf「這應該被修改爲5,TES,SFSFSF」sdfsf而不是5 ,TES,SFSFSFsdfsf – Raghunath