我有一个吨的.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)列获取重复值的问题。
答案 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”。