我想通过读取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(在这种情况下)。
答案 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]]