如何将第一列作为键从csv文件创建键值对

时间:2019-07-13 06:49:08

标签: scala

我有一个csv文件,其中包含以下数据:

key1,value1,value2,value3  
key2,value1,value2,value3  
key3,value1,value2,value3

我能够在Scala中读取文件,但此后没什么。

val file = scala.io.Source.fromFile("filepath").getLines.toList
file: List[String] = List(key1,value1,value2,value3, key2,value1,value2,value3, key3,value1,value2,value3)

我希望输出像:

Map(key1->value1),Map(key1->value2),Map(key1->value3),Map(key2->value1) ...以此类推`

1 个答案:

答案 0 :(得分:1)

假设这是固定的布局,则可以将files的值变成键/值对,如下所示:

val kv = file
  .grouped(4)
  .flatMap{
    case List(k, v1, v2, v3) => List(k -> v1, k ->v2, k -> v3)
  }.toList

这给

List((key1,value1), (key1,value2), (key1,value3), (key2,value1), (key2,value2), (key2,value3), (key3,value1), (key3,value2), (key3,value3))  

您的最终输出看起来很奇怪,因为它只是单项Map的列表,但是,如果这确实是您想要的,则只需要一个简单的map调用:

kv.map(x => Map(x))

更新

如果每行中的值数量可变,则需要分别处理每行,如下所示:

val src = scala.io.Source.fromFile("filepath")
val res =
  src.getLines.toList.flatMap { line =>
    line.split(",").toList match {
      case key :: values =>
        values.map(v => key -> v)
      case _ =>
        Nil
    }
  }
src.close()