如何从 csv 字符串中获取地图

Posted

技术标签:

【中文标题】如何从 csv 字符串中获取地图【英文标题】:HowTo get a Map from a csv string 【发布时间】:2011-03-15 22:50:48 【问题描述】:

我对 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]

有人可以帮忙吗? 谢谢

【问题讨论】:

【参考方案1】:

只需将您的 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))

【讨论】:

另一个要知道的技巧是Map++ 方法采用TraversaleOnce,因此您可以像这样使用stMap[String, String]() ++ st.flatMap(n => n)。兰德尔的方式更好。 感谢您的快速答复。我的问题不是 flatMap 而不是 map(虽然这也很有帮助),但不知道
Map(Seq(A,B) : _*) 
构造函数。
【参考方案2】:

在 2.8 中,您可以这样做:

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

collect 类似于map,但也过滤未在偏函数中定义的值。 toMap 将从Traversable 创建一个Map,只要它是Traversable[(K, V)]

【讨论】:

我想那是我真正想要的。谢谢!【参考方案3】:

Randall 的解决方案也值得一看,以便理解,这可能更清晰,或者至少让您更好地了解 flatMap 正在做什么。

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

【讨论】:

【参考方案4】:

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

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

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

但是 Ben Lings 的更好。

【讨论】:

【参考方案5】:
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)))

【讨论】:

以上是关于如何从 csv 字符串中获取地图的主要内容,如果未能解决你的问题,请参考以下文章

将位置存储为字符串,从字符串中获取位置以显示在地图上。 iOS

从字符串中获取键/值对并存储在地图中

如何从 CSV 文件中获取每一行的第一列?

如何从字符串值中获取数字代码?

Python 从 CSV 读取数据

如何从时区字符串列中获取时区字符串?