在我开始拔头发之前,我想我应该首先寻求帮助:
我正在尝试从文件中读取数据(逐行)并计算每行中前两个字符出现的频率。结果应该写入文本文件。
如果一行以**
开头,则会增加一个计数器(recordCount
)并打印到控制台。它确实打印增加数字到控制台。但是,如果我在lineReader.on()
块下面访问此变量或其他变量,则它们都具有初始值。这怎么可能?
"use strict";
// ...
function processFile(filePath, outFile) {
let inFile = fs.createReadStream(filePath).pipe(new bomstrip());
let lineReader = readline.createInterface({
input: inFile
});
let tagCounts = {};
let recordCount = 0;
lineReader.on("line", function(line) {
let tag = line.slice(0, 2);
tag.trim();
if (!tag) {
return;
}
else if (tag == "**") {
recordCount++;
console.log(recordCount); // prints increasing numbers to console
} else {
let val = tagCounts[tag];
if (val === undefined) {
tagCounts[tag] = 1;
} else {
tagCounts[tag]++;
}
}
});
console.log(recordCount); // prints 0, but why?!
// ...
}
我在Windows 8.1 64位上使用Node v5.7.0。我也尝试了var
而不是let
,但结果相同。
答案 0 :(得分:1)
您仍然可以使用您的代码,但您需要进行一些调整。如果要打印总计数,则必须等到整个文件读取完成。你可以通过听the 'close'
event来做到这一点。
这段代码可能就是您之后的代码:
"use strict";
// ...
function processFile(filePath, outFile) {
let inFile = fs.createReadStream(filePath).pipe(new bomstrip());
let lineReader = readline.createInterface({
input: inFile
});
let tagCounts = {};
let recordCount = 0;
lineReader.on("line", function(line) {
let tag = line.slice(0, 2);
tag.trim();
if (!tag) {
return;
} else if (tag == "**") {
recordCount++;
console.log(recordCount); // prints increasing numbers to console
} else {
let val = tagCounts[tag];
if (val === undefined) {
tagCounts[tag] = 1;
} else {
tagCounts[tag]++;
}
}
});
lineReader.on("close", function() {
console.log(recordCount); // prints 0, but why?!
});
// ...
}