Scala 如何从csv文件中创建键值对,将第一列视为键

Scala 如何从csv文件中创建键值对,将第一列视为键,scala,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, ke

我有一个包含以下数据的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)
…等等`

假设这是一个固定布局,您可以将
文件
值转换为如下键/值对:

val kv = file
  .grouped(4)
  .flatMap{
    case List(k, v1, v2, v3) => List(k -> v1, k ->v2, k -> v3)
  }.toList
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()
这给

List((key1,value1), (key1,value2), (key1,value3), (key2,value1), (key2,value2), (key2,value3), (key3,value1), (key3,value2), (key3,value3))  
您的最终输出看起来很奇怪,因为它只是单个条目的列表
Map
s,但如果这确实是您想要的,那么它只需要一个简单的
Map
调用:

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

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

val kv = file
  .grouped(4)
  .flatMap{
    case List(k, v1, v2, v3) => List(k -> v1, k ->v2, k -> v3)
  }.toList
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()

地图中的键必须是不同的。如果您有重复的键值,
map(key1)
将返回什么
value1
value2
value3
?我已经修改了预期的输出,这里的最终目标是为输入文件的每个单元格创建一个
key->value
对,其中第一列将是键,另一列将是该键的值。感谢您给出答案,我试着运行这个,但发现了下面的错误。另外,考虑到文件中的列数可能会有所不同,也就是说,它没有固定的布局,请您以更一般的方式提出建议。
val kv=file.grouped(4)。flatMap{case List(k,v1,v2,v3)=>List(k->v1,k->v2,k->v3)}。toList scala.MatchError:List(键1,value1,value2,value3,键2,value1,value2,value3,键3,value1,value2,value3)(属于scala.collection.immutable类。$colon$c-olon)
我添加了一个版本,可以处理每行中不同的列数。现在还不清楚为什么您需要一个单个条目的列表
Map
s。感谢更新的代码,Regd。
Map
用法我正在做一个练习,我必须比较两个文件数据(预期包含类似的记录集)如果有差异,请找出差异。因此,我正在尝试为每个单元格创建键值对(将第1列视为键,其余列视为值),然后在此基础上进行比较。我不确定这是否是一种可行的方法,请分享逻辑,以防有更好的逻辑。