在.CSV中查找唯一值

时间:2016-06-07 21:22:51

标签: javascript node.js csv unique bigdata

我有一个吨的.CSV数据文件,我的意思是TON(超过80万行)的数据。

数据全部分为两列,如下所示:

 src      |      dst 
123123    |     456456
321321    |     654654
987987    |     789789
123123    |     456456

以及其他8000万行。

(注意:我知道分隔符应该是.CSV中的',但在这种情况下,它是' |'。文件扩展仍然是.CSV)

我试图弄清楚如何编写一个可以读取所有数据的程序,并在' src'中打印出重复值的数量。领域。例如,在我的示例中,输出看起来像' 123123:出现2次'

我尝试了一些解决方案,最值得一提的是:How to read the csv file properly if each row contains different number of fields (number quite big)?

我写了一个循环来分割' src'来自' dst'与' newData'是.CSV文件

    //go through each line and split + link the data to src/dst
  data.forEach(function (line) {
    newData = line.split('|'); //note, split returns an array

    let src = newData[0]; //src from data.csv
    let dst = newData[1]; //dst from data.csv


    //test print the data
    //console.log(newData);
  });

但是我遇到了从newData [0](src)列获取重复值的问题。

2 个答案:

答案 0 :(得分:2)

它可以在一个循环中完成(O(N)复杂性解决方案......如果你有8000万行......非常重要...):

function solution(A)
{
    var lines = A.split(/\r?\n/g);

    var counts = {};
    var multiples = {};

    for (var i=0, ii=lines.length; i<ii; i++)
    {
        var splt = lines[i].split(/\s*\|\s*/g);
        var val = splt[0];

        if (!counts[val]) {
            counts[val] = 1;
        } else {
            counts[val]++;
            multiples[val] = counts[val];
        }
    }

    return multiples;
}

返回一个对象,其中包含第一列中多次存在的所有值的键,它们的值表示它们出现的次数。例如,您的给定字符串将返回对象:

{ '123123': 2 }

因为该值被看到两次。

这是一个工作的jsfiddle(它将它记录到控制台,所以打开你的开发工具):https://jsfiddle.net/x8b7ko3g/

答案 1 :(得分:0)

我会先尝试对文件进行排序,例如使用命令行工具“排序”。之后,您可以计算相同“src”重复的频率,直到找到另一个“src”。