我试图在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");
});
});
您是否尝试过.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
尝试使用另一种方法,当'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));
});
});
});
尝试使用我测试过的
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