【问题标题】:Finding unique values in a .CSV在 .CSV 中查找唯一值
【发布时间】:2016-10-07 23:03:08
【问题描述】:

我有一个包含大量数据的 .CSV 数据文件,我的意思是一吨(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) 列获取计数重复值时遇到问题。

【问题讨论】:

  • 每次获取文件时,您是否总是知道文件中有多少行?

标签: javascript node.js csv unique bigdata


【解决方案1】:

它可以在一个循环中完成(一个 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/

【讨论】:

  • 抱歉,我现在看到你想要它只是为了“src”列...不是很难改变,给我一分钟...
  • 这是一个很好的解决方案,谢谢!我会等你的改变
  • ...一个大约 O(n) 的解决方案,它可能是最快的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2016-10-26
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多