比较并匹配2个csv文件

时间:2017-03-23 16:10:38

标签: javascript mysql node.js csv

我有2个文件(两个文件都是> 1,000,000行):

第一个文件只包含一个md5哈希

第二个文件包含md5; emailadress

现在我必须比较这两个文件,如果md5哈希是相同的 - >将电子邮件地址写在一个单独的文件中。

我用mysql尝试并加入

SELECT `email` FROM `intern` INNER JOIN `extern` ON `intern`.`md5` = `extern`.`md5`

并读取2 csv并在2个循环中进行比较。的NodeJS:

  fs.readFile('public/md5-data/reachadout.csv', (err, internFile) => {
    fs.readFile('public/md5-data/customer.csv', (err, externFile) => {
      var internLines = internFile.toString().split('\n');
      var externLines = externFile.toString().split('\n');
      internLines.forEach(function(iLine){
        var internCells = iLine.split(';');
        if(externLines.indexOf(internCells[0]) > -1){
          fs.appendFileSync('public/md5-data/blacklist.csv', internCells[1] + '\n');
        }
      })
    })
  })

两种方式都很慢。还有其他算法或解决方案吗?

1 个答案:

答案 0 :(得分:2)

而是创建一个查找对象,您可以在其中查找散列是否在externFile中 我修改了你的代码来做到这一点

fs.readFile('public/md5-data/reachadout.csv', (err, internFile) => {
    fs.readFile('public/md5-data/customer.csv', (err, externFile) => {
      var internLines = internFile.toString().split('\n');
      var externLines = externFile.toString().split('\n');
      var externLookup = {};   //Added line
      externLines.forEach(function (eLine){   //Added line
          externLookup[eLine] = true;         //Added line
      });                                     //Added line
      internLines.forEach(function(iLine){
        var internCells = iLine.split(';');
        if(externLookup[internCells[0]]){  //Changed line
          fs.appendFileSync('public/md5-data/blacklist.csv', internCells[1] + '\n');
        }
      })
    })
  })

您的代码最大的问题是,对于" InternFile"中的每一行,它必须检查externfile中的每一行并查看是否存在匹配。如果你像我一样创建一个对象,那么查询一个对象是否存在就会更快

编辑:或者,你可以像使用SQL一样使用SQL,但是你必须在hash_column中添加一个INDEX。