如何使用数据中的反斜杠处理分隔符

时间:2018-06-08 12:22:31

标签: regex scala apache-spark

我如何处理|,它也是我数据中的分隔符,

以下是示例字段值

|152| XXXXXXXXXX XXXXXXXXXX.1001 0503~ADX\|0\|ZZ~NTE\|ADD\|XXXXXXXXXX/~SE\|40\|0060~GE\||

XXXXXXXXXX XXXXXXXXXX.1001 0503~ADX\|0\|ZZ~NTE\|ADD\|XXXXXXXXXX/~SE\|40\|0060~GE\是单个字段值,但由于转义了反斜杠,因此值将移至下一个字段。

我需要使用列值XXXXXXXXXX XXXXXXXXXX.1001 0503~ADX\|0\|ZZ~NTE\|ADD\|XXXXXXXXXX/~SE\|40\|0060~GE\,并且不应将其拆分为多个列。如何修复此问题。

regexp_replace(col(c), "\\\\|", "\\\\\\\\|"))无效

1 个答案:

答案 0 :(得分:1)

如问题中所述,如果您的格式为

152| XXXXXXXXXX XXXXXXXXXX.1001 0503~ADX\|0\|ZZ~NTE\|ADD\|XXXXXXXXXX/~SE\|40\|0060~GE\||

然后,您应该使用 sparkContext的textFile 读取它,并将\|替换为其他字符串,然后将 split 替换为|,转换为{ {1}}并最终使用dataframe函数将转换后的字符串替换回regexp_replace

\|

应该给你

val rdd = sc.textFile("path to the text file")
              .map(line => Row.fromSeq(line.replaceAll("\\\\\\|", "#%#").split("\\|", -1).toSeq))

val schema = StructType(Seq(StructField("col1", StringType, true),StructField("col2", StringType, true),StructField("col3", StringType, true)))

val df = spark.createDataFrame(rdd, schema)

df.withColumn("col2", regexp_replace(col("col2"), "#%#", "\\\\\\|")).show(false)

我希望答案很有帮助