Экспорт карты в файл CSV - PullRequest
       22

Экспорт карты в файл CSV

1 голос
/ 21 октября 2019

У меня есть карта [String, Seq [Any]], и я хочу сериализовать ее в файл CSV.

пример:

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

до

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

какие-либо предложения?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Чтобы решить эту проблему, я бы определил метод как ниже , если у меня нет контроля над размерами списков :

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))

, пожалуйста, посмотрите https://www.scala -lang.org / api / current / scala / collection / immutable / List. html # transpose для получения дополнительной информации о 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 не будет работать для пустых списков. Отфильтруйте непустые списки перед вызовом.

2 голосов
/ 21 октября 2019

Примерно так может быть начало:

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 .

...