如何在 Scala 中将多个地图导出到 csv?

How to export multiple maps to csv in Scala?

如何使用 scala 将所有这些地图导出到单个 csv 文件? mapKey 包含来自所有映射的所有键,但并非所有(语言)映射都可能具有某个键的值。 标题行应包含 "key"、"default"、"de"、"fr"、"it"、"en"

val mapDefault: Map[String, String] = messages.getOrElse("default",Map())

val mapDe: Map[String, String] = messages.getOrElse("de", Map())

val mapFr: Map[String, String] = messages.getOrElse("fr", Map())

val mapEn: Map[String, String] = messages.getOrElse("en", Map())

val mapIt: Map[String, String] = messages.getOrElse("it", Map())

var mapKey: Set[String] = mapDefault.keySet ++ mapDe.keySet ++ 
mapFr.keySet ++ mapEn.keySet ++ mapIt.keySet

如评论中所述 - 最好使用一些为您构建 CSV 的库,尤其是处理输入中的特殊字符(逗号或换行符)(如果您不小心,这会破坏您的 CSV)。

无论哪种方式 - 您首先必须将数据转换为具有固定顺序和列数的记录序列。

下面是一个使用任何库的实现,只是为了展示它在 Scala 中是如何完成的要点——随意用适当的库替换实际的 CSV 创建:

// create headers row:
val headers = Seq("key", "default", "de", "fr", "it", "en")

// data rows: for each key in mapKey, create a Seq[String] with the values for this 
// key (in correct order - matching the headers), or with empty String for 
// missing values
val records: Seq[Seq[String]] = mapKey.toSeq.map(key => Seq(
  key,
  mapDefault.getOrElse(key, ""),
  mapDe.getOrElse(key, ""),
  mapFr.getOrElse(key, ""),
  mapIt.getOrElse(key, ""),
  mapEn.getOrElse(key, "")
))

// add the headers as the first record
val allRows: Seq[Seq[String]] = headers +: records

// create CSV (naive implementation - assumes no special chars in input!)
val csv: String = allRows.map(_.mkString(",")).mkString("\n")

// write to file:
new PrintWriter("filename.csv") { write(csv); close() }