【问题标题】:How do you stream a csv file into a node web app?如何将 csv 文件流式传输到节点 Web 应用程序中?
【发布时间】:2015-02-27 01:44:23
【问题描述】:

我刚刚在工作中接手了一个新项目。它是一个内部 ExpressJS 应用程序,允许员工输入数据。有一项功能允许他们输入工资调整,但该页面只允许他们一次输入一个调整并点击提交。他们想要一个批量上传功能,这样他们就可以上传一个可能有数百个调整的 CSV 文件。

我的功能正常,但我使用的文件上传中间件将文件放在临时目录中。我目前正在读取文件,解析调整项,并将调整应用到工资单数据库,然后从服务器中删除临时文件。这一切都很好,但我真的很讨厌我正在执行文件系统 I/O 以及在解析数据时将文件读入内存。

随着我了解有关通过 http 传输数据的更多信息,我意识到应该可以将文件流式传输并在项目到来时对其进行解析。如果是这样,我应该为此目的使用一个流行的模块吗?将文件流式传输到服务器并动态解析它的最简单方法是什么?

【问题讨论】:

    标签: node.js csv file-upload express stream


    【解决方案1】:

    https://www.npmjs.com/package/busboy https://www.npmjs.com/package/fast-csv

    var Busboy = require('busboy'); // to handle the form
    var csv = require('fast-csv');
    
    function (req, res) {
      var busboy = new Busboy({ headers: req.headers });
      busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
        file.pipe(csv())
          .on('data', function (data) {
            console.log('YAY, just the data I wanted!', data);
          });
      });
      busboy.on('finish', function() {
        console.log('Done parsing form!');
        res.end();
      });
      req.pipe(busboy);
    }
    

    【讨论】:

    • 正是我想要的。谢谢!很抱歉延迟接受;假期等:)
    • 注意,我没有进行任何错误处理。所有的流都有错误事件,如果不处理就会抛出。
    【解决方案2】:

    我知道答案已经被接受,但我很痛苦地试图让答案的代码正常工作。 最后,对我有用的是这个,仍然使用fast-csvbusboy

    var Busboy = require('busboy');
    var parser = csv();
    
    function(req, res) {
        var busboy = new Busboy({ headers: req.headers });
        var result = [];
        busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
            file.on("readable", function () {
                var data;
                while ((data = file.read()) !== null) {
                    parser.write(data);
                }
            })
            .on("end", function () {
                parser.end();
            });
        });
    
        parser.on("readable", function () {
            var data;
            while ((data = parser.read()) !== null) {
                //console.log(data);
                result.push(data);
            }
        })
        .on("end", function () {
            console.log("done:",result);
            res.json(result);
        });
    
        req.pipe(busboy);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2020-04-06
      • 2020-11-28
      • 2021-11-08
      相关资源
      最近更新 更多