如何通过csv文件并创建2元组的映射?

时间:2016-02-18 09:07:08

标签: java scala csv opencsv

我有一个简单的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解决方案也会很棒。

2 个答案:

答案 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)])(_ + _)

请注意,我已使用,替换了您的分隔符(任意数量的空格),因为它使事情变得更加简单。