【问题标题】:How to validate data from csv file in nodejs?如何在nodejs中验证来自csv文件的数据?
【发布时间】:2021-09-12 00:51:01
【问题描述】:

我的 CSV 文件包含 3 列:名字、姓氏、电子邮件。我想在数据库的用户表中添加 CSV 文件的所有有效行。例如:如果 CSV 文件有 10 行,其中第 2 行缺少名字,第 3 行包含无效电子邮件,我希望看到 8 个用户添加到数据库。从 CSV 文件添加用户后,应显示添加了多少用户以及失败了多少。

我的模特:

 const User = sequelize.define(
    "users",
    {
      first_name: {
        type: Sequelize.STRING(60),
        allowNull: false,
      },
      last_name: {
        type: Sequelize.STRING(60),
        allowNull: false,
      },
      email: {
        type: Sequelize.STRING(255),
        allowNull: false,
      },

我的控制器:

 const upload = async (req, res) => {
    try {
      if (req.file == undefined) {
        return res.status(400).send("Please upload a CSV file!");
      }
     
      let users = [];
      console.log(" __basedir",  __basedir);
      let path = __basedir + "/uploads/" + req.file.filename;

  
      fs.createReadStream(path)
        .pipe(csv.parse({ headers: true }))
        .on("error", (error) => {
          throw error.message;
        })
        .on("data", (row) => {
          users.push(row);
        })
        .on("end", () => {
          User.bulkCreate(users, {
            validate: true,
          })
            .then(() => {
              res.status(200).send({
                message:
                  `Uploaded ${users.length} data  successfully from ` + req.file.originalname,
              });
            })
            .catch((error) => {
              res.status(500).send({
                message: `Fail to import ${users.length}  into database!`,
                error: error.message,
              });
            });
        });
    } catch (error) {
      res.status(500).send({
        message: "Could not upload the file: " + req.file.originalname,
      });
    }
};

我该如何解决这个问题?

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    我使用 fast-csv 包解决它

    import * as csv from 'fast-csv';
    
    const upload = async (req, res) => {
        try {
          if (req.file == undefined) {
            return res.status(400).send("Please upload a CSV file!");
          }
         
          let users = [];
          console.log(" __basedir",  __basedir);
          let path = __basedir + "/uploads/" + req.file.filename;
    
          console.log("path", path);
    
    
      let emailPattern= /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
      let successCount = 0;
      let errorCount = 0;
          fs.createReadStream(path)
            .pipe(csv.parse({  headers: [ undefined,'first_name', 'last_name', 'email', undefined ],renameHeaders: true, ignoreEmpty: true }))
            .validate(data => data.first_name !== '' && data.last_name !== '' && emailPattern.test(data.email))
            .on("error", (error) => {          
              throw error.message;
            })
            .on("data", (row) => {
              successCount++;
              users.push(row);
              console.log(`ROW=${JSON.stringify(row)}`)
            })
            .on('data-invalid', (row, rowNumber) => {
              errorCount++;
              console.log(`Invalid [rowNumber=${rowNumber}] [row=${JSON.stringify(row)}]`)
            })
            .on("end", (rowCount) => {
              console.log(`Parsed ${rowCount} rows`)
              User.bulkCreate(users, {
                validate: true,
              })
               
              
                .then(async() => {
               
                  res.status(200).json({
                    error: false,
                    success:
                      `Uploaded ${successCount} row successfully from ` + req.file.originalname,
                    failed:`Uploaded ${errorCount} row failed from ` + req.file.originalname,
                         
                  });
                })
                .catch((error) => {
                  console.log(error);
                  res.status(500).json({
                    error: error.message,
                    failed: `Fail to import ${users.length} row into database!`,
                
                  });
                });
            });
        } catch (error) {
          console.log(error);
          console.log(error.message);
          res.status(500).json({
            error: error.message,
            failed: "Could not upload the file: " + req.file.originalname,
          });
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2011-01-27
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      相关资源
      最近更新 更多