地图导出到 CSV 文件
Map export to CSV file
我有一个 Map[String,Seq[Any]],我想将它序列化为 CSV 文件。
示例:
Map("k1"-> List(1,2,3),"k2"->List ("toto","fofo","popo"))
到
k1,k2
1,toto
2,fofo
3,popo
有什么建议吗??
这样的事情可以作为一个开始:
val m : Map[String, Seq[Any]] = Map("k1"-> Seq(1,2,3),"k2"->Seq("toto","fofo","popo"))
val file = new File("/path/to/output/file")
val pw = new PrintWriter(new FileWriter(file))
val header = m.keys.toList
val numLines = m(header.head).get.size
pw.println(header.mkString(","))
(0 until numLines).foreach(n => {
val line = header.map(k => m(k)(n)).mkString(",")
pw.println(line)
})
pw.close()
编辑:我误解了问题,原来的答案是错误的。对于另一种方法,请参阅 LuisMiguelMejíaSuárez 的 link.
为了解决这个问题,我会定义如下所示的方法如果我无法控制列表大小:
def zipNestedLists[A](lists: List[List[A]]): List[List[Any]] = lists match {
case Nil => Nil
case Nil :: _ => Nil
case _ => lists.map(_.head) :: zipNestedLists(lists.map(_.tail))
}
如果我确定所有列表都具有相同的大小,那么在这种情况下我会使用 transpose
:
scala> List(List(a1,a2,a3,a4), List(b1,b2,b3,b4), List(c1,c2,c3,c4)).transpose
List(List(a1,b1,c1),List(a2,b2,c2),List(a3,b3,c3),List(a4,b4,c4))
有关 transpose
的更多信息,请参阅 https://www.scala-lang.org/api/current/scala/collection/immutable/List.html#transpose。
然后构造表头:
val header: String = map.keySet.mkString(",")
之后,正文:
val body = zipNestedLists(map.values.toList)
然后输出到文件(感谢@jrook)
val file = new File("path")
val pw = new PrintWriter(new FileWriter(file))
pw.println(header)
body.foreach(v => pw.println(v.mkString(",")))
pw.close()
请注意,zipNestedLists
方法对于空列表将失败。在调用之前过滤非空列表。
我有一个 Map[String,Seq[Any]],我想将它序列化为 CSV 文件。
示例:
Map("k1"-> List(1,2,3),"k2"->List ("toto","fofo","popo"))
到
k1,k2
1,toto
2,fofo
3,popo
有什么建议吗??
这样的事情可以作为一个开始:
val m : Map[String, Seq[Any]] = Map("k1"-> Seq(1,2,3),"k2"->Seq("toto","fofo","popo"))
val file = new File("/path/to/output/file")
val pw = new PrintWriter(new FileWriter(file))
val header = m.keys.toList
val numLines = m(header.head).get.size
pw.println(header.mkString(","))
(0 until numLines).foreach(n => {
val line = header.map(k => m(k)(n)).mkString(",")
pw.println(line)
})
pw.close()
编辑:我误解了问题,原来的答案是错误的。对于另一种方法,请参阅 LuisMiguelMejíaSuárez 的 link.
为了解决这个问题,我会定义如下所示的方法如果我无法控制列表大小:
def zipNestedLists[A](lists: List[List[A]]): List[List[Any]] = lists match {
case Nil => Nil
case Nil :: _ => Nil
case _ => lists.map(_.head) :: zipNestedLists(lists.map(_.tail))
}
如果我确定所有列表都具有相同的大小,那么在这种情况下我会使用 transpose
:
scala> List(List(a1,a2,a3,a4), List(b1,b2,b3,b4), List(c1,c2,c3,c4)).transpose
List(List(a1,b1,c1),List(a2,b2,c2),List(a3,b3,c3),List(a4,b4,c4))
有关 transpose
的更多信息,请参阅 https://www.scala-lang.org/api/current/scala/collection/immutable/List.html#transpose。
然后构造表头:
val header: String = map.keySet.mkString(",")
之后,正文:
val body = zipNestedLists(map.values.toList)
然后输出到文件(感谢@jrook)
val file = new File("path")
val pw = new PrintWriter(new FileWriter(file))
pw.println(header)
body.foreach(v => pw.println(v.mkString(",")))
pw.close()
请注意,zipNestedLists
方法对于空列表将失败。在调用之前过滤非空列表。