java - 如何遍历 csv 文件并从中创建 2 元组的映射?

标签 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 ((国家,城市),(最小,最大))

这样我就可以浏览这张 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/

相关文章:

java - Android 偏好组逆序

open-source - 有哪些非常大的函数式语言项目可以免费获得?

mysql - 在Python中将CSV数据加载到MySQL中

python - 在 python 中导出一个 utf-8 csv 文件

java - 退出选择模式后,ListView 选择保持不变

java - RecyclerView 占用所有屏幕空间

scala - 为什么运行时反射宇宙和宏宇宙为 scala.None 创建两个不同的树?

php - 在 PHP 中将 mysql 查询导出到 CSV 的最干净的方法

java - 获取数独可能的解决方案 方法

scala - Scala 中的发散隐式扩展,涉及链式隐式