在.CSV中查找唯一值

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

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

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

等八千万行。

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

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

我已经尝试了几个解决scheme,最值得注意的是: 如果每行都包含不同数量的字段(数字相当大),如何正确读取CSV文件?

我写了一个循环来将'drc'中的'src'拆分成'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)列中获取计数重复值。

它可以在一个单一的循环中完成(一个O(N)复杂的解决scheme…如果你有八千万行……非常重要):

 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; } 

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

{ '123123': 2 }

因为那个价值被看了两次。

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

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