我需要解析 Node js 服务器上的文本文件。文本文件由标题和项目列表组成,全部位于单独的行上。我发出一个请求,然后将响应传输到解析器流。我需要从标题中提取时间。问题是有时 header 变量会附加文件中间的一些信息。如果我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 流是如何完全工作的。所以,请帮忙。
最佳答案
您可以使用 NPM split 模块逐行解析流,我在流中使用此模块。这是完整的代码。
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'));
关于javascript - 使用转换流解析文本文件时出现 Node js 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638705/