我在数据框中有一列,其数据如下所示。现在我只需要test1之后的元素
即它应该返回abc,efg,ghg,并且每行的长度也不同。
test1:abc,test2:ghr,test2:jkl,test1:efg,test3:erp dfg (jfg),test1:ghg
我正在尝试编写一个方法来在test1之后返回部件,我尝试如下。 但它不会完全符合我的预期目标。如果有办法实现它,请告诉我
def findStr(str:String):Array[String]= {
if (str.contains ("test1:") ) {
val res = test.split ("test1:")
for (i <- res.length - 1) {
val res1 = res (i)
if (res1.contains (",") ) {
val res2 = res1.split (",")(0)
}
else null
}
else null
}
答案 0 :(得分:0)
这样做的一种方法:
val input = " test1:abc,test2:ghr,test2:jkl,test1:efg,test3:erp dfg (jfg),test1:ghg"
input
.split(",")
// Array(" test1:abc", test2:ghr, test2:jkl, test1:efg, test3:erp dfg (jfg), test1:ghg)
.map(_.split(":"))
// Array(Array(" test1", abc), Array(test2, ghr), Array(test2, jkl), Array(test1, efg), Array(test3, erp dfg (jfg)), Array(test1, ghg))
.filter{ case Array(k, v) => k.trim == "test1" }
// Array(Array(" test1", abc), Array(test1, efg), Array(test1, ghg))
.map{ case Array(k, v) => v }
// Array(abc, efg, ghg)
.mkString(",")
// "abc,efg,ghg"
此解决方案假定输入字符串遵循以下格式:
key1:valueA,key2:valueB:key1:valueC,...
由于您拥有由test1
分隔的键值结构,而不是在","
上拆分,因此您可以拆分为“,”。
这为您提供了一系列键/值字符串,使您可以轻松地单独处理“test1”键。
我认为你去了一个递归函数,你在test1上拆分,它在test1之后直接给你值,你可以用拆分的左边部分再次调用你的函数,以便找到下一个“test1”,依此类推。但我认为在这种情况下这有点过分。
作为旁注,我建议不要在Scala中使用null
,而是使用Option monad。