删除重复项

时间:2013-01-10 14:25:47

标签: scala csv duplicates

我想从CSV文件中的数据中删除重复项。 第一列是年份,第二列是句子。无论年份信息如何,我都希望删除任何重复的句子。

是否有可以在val text = {}中插入的命令来删除这些欺骗?

我的脚本是:

val source = CSVFile("science.csv");

val text = {
source ~>                              
Column(2) ~>                           
TokenizeWith(tokenizer) ~>             
TermCounter() ~>                       
TermMinimumDocumentCountFilter(30) ~>  
TermDynamicStopListFilter(10) ~>      
DocumentMinimumLengthFilter(5)         
} 

谢谢!

3 个答案:

答案 0 :(得分:1)

基本上你需要一个distinct版本,你可以在其中指定使对象(行)唯一的东西(第二列)。

给出代码:(修改后的SeqLike.distinct)

type Row = (Int, String)
def distinct(rows:Seq[Row], f: Row => AnyRef) = {
   val b = newBuilder
   val seen = mutable.HashSet[AnyRef]()
   val key = f(x)
   for (x <- rows) {
     if (!seen(key)) {
       b += x
       seen += key
     }
   }
   b.result
 }

如果您有一个行列表(行是一个元组),您可以根据第二列

获取已过滤/唯一的行
distinct(rows, (_._2))

答案 1 :(得分:0)

您是否需要重现代码?如果没有,那么在Excel中,单击“数据”选项卡,单击“1”正上方的小方框,然后单击“A”的左侧以突出显示所有内容,单击“删除重复项”,确保“我的数据有标题”如果您有标题,则选中该选项,然后取消选中具有年份的列,只保留其旁边带有复选标记的列。这将删除重复的句子,但保留年份的第一个实例。

答案 2 :(得分:0)

由于集合自然会消除重复,因此一种简单的方法是使用自定义排序将行填充到TreeSet中,该排序仅考虑每行的文本部分。

更新

以下是演示上述内容的示例脚本:

import collection.immutable.TreeSet
import scala.io.Source

val lines = Source.fromFile("science.csv").getLines()
val uniques = lines.foldLeft(TreeSet[String]()(Ordering.by(_.split(',')(1)))) {
  (s, l) =>
    if (s contains l) s
    else s + l
}
uniques.toList.sorted foreach println

脚本将行序列折叠成一个树集,其中自定义顺序基于逗号分隔行的第二部分。最简单的折叠函数是(s, l) => s + l;然而,这将导致后期年份覆盖行与早年相同文本的行。这就是我必须首先测试收容的原因。

现在我们已经准备好了,我们只需要在打印前按年重新排序集合(假设输入按年份排序)。