我有一个简单的 csv 文件,如下所示
Country city min max
Germany Berlin 13 6
Germany Munich 19 6
Germany Hamburg 19 18
Spain Madrid 10 9
Spain Barcelona 10 9
我想读取这个文件并创建一个Map,它的键是一个元组,值是一个元组:
myMap = map ((国家,城市),(最小,最大))
这样我就可以浏览这张 map 并检查我是否有 key (德国,柏林)
我可以拉出它的最小值和最大值......
如何使用 csv 阅读器执行此操作?我正在使用tototoshi
我正在使用 scala,但 java 解决方案也很棒。
最佳答案
您应该使用 scala split 来获取与分隔符(在本例中为空格)匹配的正则表达式的值,然后您将得到一个 vector ,其组成部分是行中的单词。因此,您必须做的唯一一件事就是遍历数组进行打印或将元素添加到结构中,在本例中为 Map[Tuple2[String,String],Tuple2[String,String]]
结构。您可以使用语法糖来使用此元组,但使用此代码很容易看到您在做什么
源代码:
object TestCSV extends App {
val bufferedSource = io.Source.fromFile("/Users/toni/learn/scala/test-stackoverflow/src/main/scala/com/cuaqea/csv/file.csv")
val cache = collection.mutable.Map[Tuple2[String,String], Tuple2[String,String]]()
for (line <- bufferedSource.getLines) {
val cols = line.split("\\s+").map(_.trim)
println(s"${cols(0)}|${cols(1)}|${cols(2)}|${cols(3)}")
cache += (new Tuple2(cols(0),cols(1)) -> new Tuple2(cols(2), cols(3)))
}
println(cache.toString)
bufferedSource.close
}
结果:
[info] Running TestCSV
Country|city|min|max
Germany|Berlin|13|6
Germany|Munich|19|6
Germany|Hamburg|19|18
Spain|Madrid|10|9
Spain|Barcelona|10|9
Map((Country,city) -> (min,max), (Spain,Madrid) -> (10,9), (Germany,Berlin) -> (13,6), (Germany,Hamburg) -> (19,18), (Germany,Munich) -> (19,6), (Spain,Barcelona) -> (10,9))
[success] Total time: 8 s, completed Feb 18, 2016 10:41:31 AM
关于java - 如何遍历 csv 文件并从中创建 2 元组的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477036/