Scala 如何从csv文件中创建键值对,将第一列视为键
我有一个包含以下数据的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
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列视为键,其余列视为值),然后在此基础上进行比较。我不确定这是否是一种可行的方法,请分享逻辑,以防有更好的逻辑。