我有一个简单的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((country,city) , (min,max))
所以我可以浏览这张地图并检查我是否有钥匙(Germany,Berlin)
我可以拉动它的最小值&最大....
如何使用csv阅读器执行此操作?我正在使用tototoshi
我正在使用scala,但java解决方案也会很棒。
答案 0 :(得分:1)
你应该使用scala split来获取一个正则表达式,该表达式匹配此情况下空格的分隔,然后你有一个向量,其中的组件是行中的单词。因此,您必须做的唯一事情就是通过数组进行打印或在结构中添加元素(在这种情况下为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
答案 1 :(得分:0)
如果您愿意使用其他CSV库,kantan.csv会非常简单:
import kantan.csv.ops._
// Turn your file into an iterator of (String, String, Int, Int)
file.asUnsafeCsvReader[(String, String, Int, Int)](',', true)
// Turn each entry into a (String, String) -> (Int, Int)
.map(c => (c._1 -> c._2) -> (c._3 -> c._4))
// Fold on the iterator to turn it into the desired map.
.foldLeft(Map.empty[(String, String), (Int, Int)])(_ + _)
请注意,我已使用,
替换了您的分隔符(任意数量的空格),因为它使事情变得更加简单。