如何从csv字符串中获取映射

时间:2010-07-14 15:54:26

标签: string scala csv map split

我对Scala很新,但我现在正在练习 我有一个像

"A>Augsburg;B>Berlin"
这样的字符串。我最终想要的是地图

val mymap = Map("A"->"Augsburg", "B"->"Berlin")

我做的是:

val st = locations.split(";").map(dynamicListExtract _)
与功能
private def dynamicListExtract(input: String)  = {
    if (input contains ">") {
      val split = input split ">"
      Some(split(0), split(1)) // return key , value
    } else {
      None 
    } 
  }
现在我有
Array[Option[(String, String)
如何将其优雅地转换为Map [String,String]

有人可以帮忙吗? 感谢

5 个答案:

答案 0 :(得分:11)

只需将map来电更改为flatMap

scala> sPairs.split(";").flatMap(dynamicListExtract _)
res1: Array[(java.lang.String, java.lang.String)] = Array((A,Augsburg), (B,Berlin))

scala> Map(sPairs.split(";").flatMap(dynamicListExtract _): _*)
res2: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((A,Augsburg), (B,Berlin))

进行比较:

scala> Map("A" -> "Augsburg", "B" -> "Berlin")
res3: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((A,Augsburg), (B,Berlin))

答案 1 :(得分:9)

在2.8中,你可以这样做:

val locations = "A>Augsburg;B>Berlin"
val result = locations.split(";").map(_ split ">") collect { case Array(k, v) => (k, v) } toMap

collectmap类似,但也会过滤未在部分函数中定义的值。只要toMap MapTraversable就会Traversable[(K, V)]创建{{1}}。

答案 2 :(得分:3)

同样值得看看Randall在for-comprehension形式中的解决方案,这可能更清晰,或者至少可以让你更好地了解flatMap正在做什么。

Map.empty ++ (for(possiblePair<-sPairs.split(";"); pair<-dynamicListExtract(possiblePair)) yield pair)

答案 3 :(得分:0)

一个简单的解决方案(不处理错误情况):

val str = "A>Aus;B>Ber"
var map = Map[String,String]()

str.split(";").map(_.split(">")).foreach(a=>map += a(0) -> a(1))

但Ben Lings'更好。

答案 4 :(得分:0)

val str= "A>Augsburg;B>Berlin"

Map(str.split(";").map(_ split ">").map(s => (s(0),s(1))):_*)

--or--

str.split(";").map(_ split ">").foldLeft(Map[String,String]())((m,s) => m + (s(0) -> s(1)))