将NodeJS流传送到数组

时间:2016-12-06 18:55:41

标签: javascript node.js csv stream

我的用例是:我希望在Node中读取CSV文件并仅获取标题。我不想将读取流的结果写入文件,而是在读取文件后将标题推送到数组,因此我可以使用该数组并在以后对其执行某些操作。或者,更好的是,获取流并在读取时将其转换,然后将其发送到数组。文件是一个人为的价值。我被困在这一点,数据文件的当前输出是一个空数组:

const fs = require('fs');
const parse = require('csv-parse');
const file = "my file path";
let dataFile = [];

rs = fs.createReadStream(file);
parser = parse({columns: true}, function(err, data){
    return getHeaders(data)
})

function getHeaders(file){
    return file.map(function(header){
        return dataFile.push(Object.keys(header))
    })
}

为了获得我需要的结果,我需要做什么?我希望在数组中找到标题作为最终结果。

1 个答案:

答案 0 :(得分:2)

好的,所以你的代码中有一些令人困惑的东西,还有一个错误:你没有实际调用你的代码:)

首先,解决方案,在解析器之后添加此行:

rs.pipe(parser).on('end', function(){
    console.log(dataFile);
});

魔术,dataFile不是空的。 您从磁盘流式传输文件,将其传递给解析器,然后在最后调用回调。

对于令人困惑的部分:

parser = parse({columns: true}, function(err, data){
    // You don't need to return anything from the callback, you give the impression that parser will be the result of getHeaders, it's not, it's a stream.
    return getHeaders(data)
})
function getHeaders(file){
    // change map to each, with no return, map returns an array of the return of the callback, you return an array with the result of each push (wich is the index of the new object).
    return file.map(function(header){
        return dataFile.push(Object.keys(header))
    })
}

最后: 请选择不带;的结束行,但不能选择混合;)

你应该以:

之类的结尾
const fs = require('fs');
const parse = require('csv-parse');
const file = "./test.csv";
var dataFile = [];

rs = fs.createReadStream(file);
parser = parse({columns: true}, function(err, data){
    getHeaders(data);
});

rs.pipe(parser).on('end', function(){
    console.log(dataFile);
});

function getHeaders(file){
        file.each(function(header){
            dataFile.push(Object.keys(header));
        });
}