2017-07-06 57 views
0

我想從字符串中提取一個單詞,然後在我的正則表達式中使用該單詞。在Scala中的正則表達式

我的字符串如下所示:

val s = "null_eci_count" 

我想從上面的字符串得到以下字符串:

sum(cast((eci is null or eci in ('', '0', 'null', 'NULL')) as int)) 

我用的replaceAll,並得出上述表達式的一部分:

scala> s.replaceAll("null_", "sum(cast((").replaceAll("_count"," is null) as int))") 
res69: String = sum(cast((eci is null) as int)) 

請建議一種方法來派生整個表達式。

+0

這是什麼邏輯?我試圖做一些事情,但我不明白這是什麼邏輯。 –

回答

0

如何:

val eci = s.split("_").drop(1).head 
val result = s match {s"sum(cast(($eci is null or $eci in ('', '0', 'null', 'NULL')) as int))" 
+0

我不知道如何將此邏輯合併到我目前使用的下列語句中:val tgt = spark.sql(「select * from ctx_monitor.xpo_click_counts」); val col = tgt.columns.slice(4,tgt.columns.length).mkString(「,」)。replaceAll(「distinct _」,「count(distinct」).replaceAll(「_ cnt」,「)」)。replaceAll (「null_」,「sum(cast((」)。replaceAll(「_ count」,in(null,''))as int))「) – Sudha

+0

我不知道該語句在做什麼。也許你應該以不同的方式提出問題...... – Dima

0

選擇串作爲一組(即,ECI).*?_(.*?)_.*的中間部分,然後與組參考\1返回eci

0

我用ArrayBuffer做到這一點:

import scala.collection.mutable.ArrayBuffer 
val tgt=spark.sql("select * from ctx_monitor.xpo_click_counts") 
val a = tgt.columns.slice(4,tgt.columns.length) 
for (e <- a) { 
if (e contains "null"){ val c=e.replaceFirst("null_",""); 
col += "sum(cast((" + c + " is null or " + c + " in('','0','null','NULL')) as int))"}} 

val cols=col.mkString(",") 
相關問題