代码之家  ›  专栏  ›  技术社区  ›  adam tropp

如何解析用户在node/express中上传的csv文件中的数据?

  •  0
  • adam tropp  · 技术社区  · 8 年前

    我有一个前端react应用程序和一个后端node/express应用程序。我想允许用户上传一个csv文件,然后解析该文件并为每一行实例化一个模型。然而,我对如何做到这一点有些困惑,因为我习惯于简单地在API中发布到一个路由,并从请求体中持久化该内容。在这种情况下,请求主体中的内容就是文件,我不想保存文件,只想保存其中的数据。如何解析文件而不将其保存到数据库?我曾尝试使用multer处理上传和csv解析来解析内容,但我不确定这是否有意义。尽管如此,以下是代码(应用程序/索引):

                   ...
    const multer  = require('multer');
    const upload = multer().single();
    const parse = require('csv-parse'); 
                   ...
    
    router.post('/distributor/:id/files', (req,res) => { 
      upload(req, res, function (err) {
        if (err) {
          console.error("An error occurred when uploading. Please try again. Note 
          that you may only upload one file at a time, and we only support .csv 
          files.")
          return
        }
        console.log("We have received your file")
      })
    });  
                             ... 
    
    // router.get('/distributor/:id/files/:id', (req, res) => { 
    //   File
    //     .forge({id: req.params.id})
    //     .fetch()
    //     .then((file) => {
    //       if (_.isEmpty(file))
    //         return res.sendStatus(404);
    //       return parseJson(file)
    //     })
    //     .then((jsonData) => { 
    //       for (var i in jsonData) { 
    //         //save instance of model
    //       }
    //     })
    //     .catch((error) => {
    //       console.error(error);
    //       return res.sendStatus(500);
    //     });
    // }) 
    
    // function parseJson(file) { 
    //     var output = [];
    //       // Create the parser
    //     var parser = parse({delimiter: ':'});
    //     // Use the writable stream api
    //     parser.on('readable', function(){
    //       while(record = parser.read()){
    //         output.push(record);
    //       }
    //     });
    //     // Catch any error
    //     parser.on('error', function(err){
    //       console.log(err.message);
    //     });
    //     parser.end(); 
    // } 
    

    我知道这没有意义,因为我实际上不想将文件保存为数据库中的模型和表,我只想保存文件中的每个项目,所以我知道我无法创建名为“/distributor/:id/files/:id”的路由。但我不知道该怎么做。我希望我想做的是清楚的!我对node和编程基本上都是新手,我从未遇到过需要处理文件上传的情况。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Riken Mehta    8 年前

    您可以使用此节点模块来解析csv文件。 https://www.npmjs.com/package/csvtojson

    例如,你有文件名 users 在请求对象中。

    const csv=require('csvtojson');
    
    csv()
    .fromString(req.files.users.data.toString('utf8'))
    .on('json', (user) => {
        console.log(user);
    })
    .on('done', () => {
        console.log('done parsing');
    });
    

    您将能够以json对象的形式获取每一行。

    推荐文章