我是scala的新手,我正在从本地读取文本文件,我想在示例中找到重复的列。
输入文件:
1,2,3
2,3,4
1,3,4
2,4,5
3,4,5
我需要这样的输出:
选择第一列
1->2
2->3
3->1
程序是:
val file=scala.io.Source.fromFile("D:/Files/test.txt").getLines().mkString("\n")
val d=file.groupBy(identity).mapValues(_.size)
println(d)
但是我得到像这样的输出
Map(-> 5, 4 -> 1, 9 -> 1, 5 -> 3, , -> 12, 1 -> 3, 0 -> 1, 2 -> 5, 3 -> 4)
它计算所有数据,但我想仅在特定列中计算重复数
答案 0 :(得分:1)
这里的问题是因为一旦调用mkString
,文件上的多行就会“丢失”。另一种方法可能是使用toArray
调用。
val file = scala.io.Source.fromFile("D:/Files/test.txt")
val lines = file.getLines().toArray
在上面的例子中,lines
将是一个字符串数组:
Array(1,2,3, 2,3,4, 1,3,4, 2,4,5, 3,4,5)
然后在分组之前提取第一列,你可以在每个字符串上使用类似slice
方法的东西
lines.map(_.slice(0,1)).groupBy(identity).mapValues(_.size)
另外,请记得关闭文件:)
完整示例:
val file = scala.io.Source.fromFile("D:/Files/test.txt")
val lines = file.getLines().toArray
val grouping = lines.map(_.slice(0,1)).groupBy(identity).mapValues(_.size)
file.close
答案 1 :(得分:0)
如果我正确理解了您的问题,那么第一列的重复计数是(1->2, 2->2, 3->1)
吗?
这是获得计数的一种方法:
// Create a list of split-column arrays
val list = scala.io.Source.
fromFile("/Users/leo/projects/scala/files/testfile.txt").
getLines.
map(_.split(",")).
toList
list: List[Array[String]] = List(Array(1, 2, 3), Array(2, 3, 4), Array(1, 3, 4), Array(2, 4, 5), Array(3, 4, 5))
// Count duplicates of the 1st split-column
val d = list.
groupBy(_(0)).
mapValues(_.size)
d: scala.collection.immutable.Map[String,Int] = Map(2 -> 2, 1 -> 2, 3 -> 1)