如何使用Scala中的TextQualifier文件的双引号删除双引号和额外分隔符

时间:2017-10-05 09:07:22

标签: scala apache-spark

我有很多带文本限定符的分隔文件(每列开头和结尾都有双引号)。定界不一致,即可以有任何分隔,如逗号(,),管道(|),〜,制表符(\ 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 
  })

感谢。

1 个答案:

答案 0 :(得分:0)

你可以像这样使用两个replaceAll():

val output = pattern replaceAllIn (y, m => m.group(0).replaceAll("[,\\\\n]", " ").replaceAll("\"|\"", ""))

  

输出:String = 4,XAA,sf sd sdfsf