【问题标题】:Map export to CSV file地图导出到 CSV 文件
【发布时间】:2019-10-21 09:11:54
【问题描述】:

我有一个 Map[String,Seq[Any]],我想将其序列化为 CSV 文件。

示例:

Map("k1"-> List(1,2,3),"k2"->List ("toto","fofo","popo"))   

k1,k2
1,toto
2,fofo
3,popo

有什么建议吗??

【问题讨论】:

  • 如果输入是Map("k1"-> List(1,2,3),"k2"->List ("toto","fofo")) ,输出会是什么?
  • 输出应该是一个csv文件。
  • 好的,这个输入的 csv 里面会是什么? Map("k1"-> List(1,2,3),"k2"->List ("toto","fofo"))

标签: scala csv export-to-csv


【解决方案1】:

这样的事情可以作为一个开始:

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

【讨论】:

  • @LuisMiguelMejíaSuárez 不幸的是,我不能删除这个答案,因为它被接受了。我将使用指向您的解决方案的链接对其进行编辑。
  • @moezskanjii 请检查 cmets 和编辑后的答案。
【解决方案2】:

为了解决这个问题,如果我无法控制列表大小,我会定义如下方法

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 方法对于空列表将失败。在调用之前过滤非空列表。

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-08-27
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多