【问题标题】:Node js error when parsing a text file with transform stream使用转换流解析文本文件时出现节点 js 错误
【发布时间】:2015-07-26 15:27:06
【问题描述】:

我需要在 Node js 服务器上解析一个文本文件。文本文件由标题和项目列表组成,全部位于单独的行中。我做了一个请求,然后将响应通过管道传输到解析器流。我需要从标题中提取时间。问题是有时标头变量会从文件中间附加一些信息。如果我 console.log 它看起来像这样:

HEADER
MIDDLE_OF_THE_FILE_STUFF

最奇怪的是它并非一直都在发生。只有某些时候。并且文件中间的东西每次都从文件中的同一位置附加。我尝试做header.substring(0,len),但它只剪切标题本身,没有 MIDDLE_OF_THE_FILE_STUFF。

代码如下:

parser._transform = function(chunk,encoding,done){
    var time = {};
    var data = chunk.toString();
    lines = data.split('\n');

    header = (lines[0]);

    var regEx = /[0-9][0-9]:[0-9][0-9]/;

    var m = regEx.exec(header);
    var splitTime = m[0].split(':');
    time = {
        hours:splitTime[0],
        minutes:splitTime[1]
    }
    console.log(time);
    var pushjson = JSON.stringify(time, null, 2);
    this.push(pushjson);
    done();


}

request
    .get('url')
    .on('error', function(err){
        console.log(err)
    })
    .pipe(parser)
    .pipe(fs.createWriteStream('result.json')) 

我已经为此苦苦挣扎了很长一段时间,但我在任何地方都找不到具有相同错误的帖子。我想我可能不明白 transofrm 流是如何完全工作的。所以,请帮忙。

【问题讨论】:

  • 您可以发布您正在使用的输入文件,以便我可以从我的计算机上运行它吗?
  • 你的_transform 函数可以被调用任意次数,根据输入的大小使用更多的块。第一次调用后似乎没有任何东西可以停止发出输出。
  • 你在使用请求模块吗?

标签: javascript node.js parsing stream


【解决方案1】:

您可以使用 NPM 拆分模块逐行解析流,我在流中使用此模块。这是完整的代码。

var stream = require('stream');
var parser = new stream.Transform({
objectMode: true
});
var request = require('request');
var split = require('split');
var fs = require('fs');

var currLine = 1;
var header;

parser._transform = function(line, encoding, done) {
    var time = {};
    if (currLine === 1) {
        header = line;
        console.log(header);
        var regEx = /[0-9][0-9]:[0-9][0-9]/;

        var m = regEx.exec(header);
        var splitTime = m[0].split(':');
        time = {
            hours: splitTime[0],
            minutes: splitTime[1]
        };
        console.log(time);
        var pushjson = JSON.stringify(time, null, 2);
        this.push(pushjson);
    }
    currLine++;
    done();
};

request
    .get('http://maps.weather.gov.hk/r4/input_files/latestReadings_AWS1')
    .on('error', function(err) {
        console.log(err);
    }).
pipe(split()).pipe(parser)
    .pipe(fs.createWriteStream('result.json'));

【讨论】:

  • 非常感谢。虽然我不太明白它是如何工作的。 split 是否确保行一致?
  • 很高兴为您提供帮助。是的,它确实。 “分解一个流并重新组合它,使每一行都是一个块。” npmjs.com/package/split
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多