从Sequelize和Node.js中的CSV中删除重复值

问题描述 投票:0回答:3

我试图在csv文件中读取并在创建时删除重复的值。我尝试使用Async来做,但没有运气。我已经恢复了更简单的方式,并没有删除重复项。下面的代码读取并创建对象,但不删除重复项。我使用了fast-csv库来读取csv。

const router = require('express').Router();
const Staff = require('../models/Staff');
const fs = require('fs');
const csv = require('fast-csv');

module.exports = router;

router.get('/add_csv', function (req, res) {
   var stream = fs.createReadStream("./public/assets/csv/data_extract.csv");
   csv
   .fromStream(stream, {headers : true})
   .on("data", function(data){
       console.log(data);

        const userName = data.name;
        const firstName = data.forename;
        const lastName = data.surname;
        const email = data.college_email;

        Staff.findOrCreate({
            where : {
                userName : userName,
                firstName : firstName,
                lastName : lastName,
                email : email
            } 
        });
   })
   .on("end", function(){
       console.log("done");
       res.send("done");
   });
});
javascript node.js csv sequelize.js
3个回答
0
投票

您是否尝试过.spread子句进行调试?

如果你添加.spread子句,它将告诉你它在做什么记录。

更改

    Staff.findOrCreate({
        where : {
            userName : userName,
            firstName : firstName,
            lastName : lastName,
            email : email
        } 
    });

    Staff.findOrCreate({
        where : {
            userName : userName,
            firstName : firstName,
            lastName : lastName,
            email : email
        } 
    })
    .spread((staff, created) => {
        console.log(staff.get({
        plain: true
    }))
    console.log(created);

这将打印出记录,如果创建了新记录或其他错误,则显示为true。希望我的语法正确..

在这里看到代码:http://docs.sequelizejs.com/manual/tutorial/models-usage.html


0
投票

尝试使用另一种方法,当'data'被触发时只需将数据添加到数组中,在'end'被触发时从数组中获取唯一数据并将它们插入到数据库中。它应该事件增加性能,因为您将只执行一个数据库查询而不是每行查询。

const _ = require('lodash');

module.exports = router;

router.get('/add_csv', function (req, res) {
   const dataToInsert = []; 
   var stream = fs.createReadStream("./public/assets/csv/data_extract.csv");
   csv
   .fromStream(stream, {headers : true})
   .on("data", (data) => {
       console.log(data);
       dataToInsert.push({
        userName : userName,
        firstName : firstName,
        lastName : lastName,
        email : email
    });
   })
   .on("finish", () => {
       console.log("done");
       const uniqueDataToInsert = _.uniqBy(dataToInsert, ['userName', 'firstName', 'lastName', 'email'])
       Staff.bulkCreate(uniqueDataToInsert, {ignoreDuplicates: true}).then((result) => {
        res.send("done");
       }).catch((error) => {
           res.status(500).send(JSON.stringify(error));
       });
   });
});

0
投票

尝试使用我测试过的

sort -u data_extract.csv >> data_extract_unique.csv

它会将唯一数据写入data_extract_unique.csv

如果你想在阅读csv时使用它,请使用此方法

const reorder = require('csv-reorder');

reorder({
  input: './cashback.txt',
  output: './output.csv',
  sort: 'userName',
  type: 'string',
  remove: true,
  "remove-duplicates": true,
  metadata: false
})
.then(metadata => {
  console.log(metadata)
})
.catch(error => {
  console.log(error)
});

我测试了这个。

成功删除后,您可以从output.csv中读取数据

我用这个csv作为样本

**输入Csv **

userName,firstName,lastName,email

Rahi 374,Rahul,Sharma,Rushma @ gmail.com

Rahi 374,Rahul,Sharma,Rushma @ gmail.com

Rahi 374,Rahul,Sharma,Rushma @ gmail.com

Rahasi 574,Rahul,Sharma,Rashmar @ Gmail.com

**输出Csv **

userName,firstName,lastName,email

Rahi 374,Rahul,Sharma,Rushma @ gmail.com

Rahasi 574,Rahul,Sharma,Rashmar @ Gmail.com

© www.soinside.com 2019 - 2024. All rights reserved.