如何通过读取CSV文件在scala中创建Map [Int,Set [String]]?

时间:2014-12-05 03:55:59

标签: scala csv

我想通过读取CSV文件中的输入来在scala中创建Map [Int,Set [String]]。

我的file.csv是,

sunny,hot,high,FALSE,no
sunny,hot,high,TRUE,no
overcast,hot,high,FALSE,yes
rainy,mild,high,FALSE,yes
rainy,cool,normal,FALSE,yes
rainy,cool,normal,TRUE,no
overcast,cool,normal,TRUE,yes

我希望输出为,

var Attributes = Map[Int,Set[String]] = Map()

Attributes += (0 -> Set("sunny","overcast","rainy"))
Attributes += (1 -> Set("hot","mild","cool"))
Attributes += (2 -> Set("high","normal"))
Attributes += (3 -> Set("false","true"))
Attributes += (4 -> Set("yes","no"))

此0,1,2,3,4代表列数,而Set包含每列中的不同值。

我想将每个(Int - > Set(String))添加到我的属性" Attributes"。即,如果我们打印Attributes.size,它会显示5(在这种情况下)。

1 个答案:

答案 0 :(得分:2)

使用其中一个existing answers读取CSV文件。您将拥有二维数组或字符串向量。然后建立你的地图。

// row vectors
val rows = io.Source.fromFile("file.csv").getLines.map(_.split(",")).toVector
// column vectors
val cols = rows.transpose
// convert each vector to a set
val sets = cols.map(_.toSet)
// convert vector of sets to map
val attr = sets.zipWithIndex.map(_.swap).toMap

最后一行有点难看,因为没有直接的.toMap方法。你也可以写

val attr = Vector.tabulate(sets.size)(i => (i, sets(i))).toMap

或者你可以一次完成最后两个步骤:

val attr = cols.zipWithIndex.map { case (xs, i) => 
  (i, xs.toSet) 
} (collection.breakOut): Map[Int,Set[String]]