【问题标题】:Pipe NodeJS Stream to an Array管道 NodeJS 流到数组
【发布时间】:2017-04-21 12:42:20
【问题描述】:

我的用例是这样的:我希望在 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))
    })
}

我需要做什么才能获得所需的结果?我希望最终结果是在数组中找到标头。

【问题讨论】:

    标签: javascript node.js csv stream


    【解决方案1】:

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

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

    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));
            });
    }
    

    【讨论】:

    • 不错且可靠的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-12-15
    • 2020-04-01
    • 2021-06-01
    相关资源
    最近更新 更多