如何通过读取文本文件从Scala中的特定列中删除重复项

时间:2017-06-10 12:50:07

标签: scala

我是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)

它计算所有数据,但我想仅在特定列中计算重复数

2 个答案:

答案 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)