我想将一个非常非常大的文件读入 node.js 中的 JavaScript 数组。
所以,如果文件是这样的:
first line
two
three
...
...
我会有数组:
['first line','two','three', ... , ... ]
该函数将如下所示:
var array = load(filename);
因此,将其全部加载为字符串然后将其拆分的想法是不可接受的。
我想将一个非常非常大的文件读入 node.js 中的 JavaScript 数组。
所以,如果文件是这样的:
first line
two
three
...
...
我会有数组:
['first line','two','three', ... , ... ]
该函数将如下所示:
var array = load(filename);
因此,将其全部加载为字符串然后将其拆分的想法是不可接受的。
var fs = require('fs');
var array = fs.readFileSync('file.txt').toString().split("\n");
for(i in array) {
console.log(array[i]);
}
var fs = require('fs');
fs.readFile('file.txt', function(err, data) {
if(err) throw err;
var array = data.toString().split("\n");
for(i in array) {
console.log(array[i]);
}
});
如果您可以将最终数据放入一个数组中,那么您是否也可以将它放入一个字符串中并将其拆分,就像建议的那样?在任何情况下,如果您想一次处理一行文件,您也可以尝试以下操作:
var fs = require('fs');
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
func(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}
function func(data) {
console.log('Line: ' + data);
}
var input = fs.createReadStream('lines.txt');
readLines(input, func);
编辑:(响应phopkins 的评论)我认为(至少在较新版本中) substring 不会复制数据,而是创建一个特殊的 SlicedString 对象(快速浏览 v8 源代码)。在任何情况下,这里都有一个避免提到的子字符串的修改(在一个value几兆字节的文件上进行测试,“所有工作和不玩耍使杰克成为一个无趣的男孩”):
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
var last = 0;
while (index > -1) {
var line = remaining.substring(last, index);
last = index + 1;
func(line);
index = remaining.indexOf('\n', last);
}
remaining = remaining.substring(last);
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}
使用 Node.js readline module。
var fs = require('fs');
var readline = require('readline');
var filename = process.argv[2];
readline.createInterface({
input: fs.createReadStream(filename),
terminal: false
}).on('line', function(line) {
console.log('Line: ' + line);
});
js:
var array = fs.readFileSync('file.txt', 'utf8').split('\n');
ts:
var array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');
使用 readline(文档)。这是一个读取 css 文件、解析图标并将它们写入 json 的示例
var results = [];
var rl = require('readline').createInterface({
input: require('fs').createReadStream('./assets/stylesheets/_icons.scss')
});
// for every new line, if it matches the regex, add it to an array
// this is ugly regex :)
rl.on('line', function (line) {
var re = /\.icon-icon.*:/;
var match;
if ((match = re.exec(line)) !== null) {
results.push(match[0].replace(".",'').replace(":",''));
}
});
// readline emits a close event when the file is read.
rl.on('close', function(){
var outputFilename = './icons.json';
fs.writeFile(outputFilename, JSON.stringify(results, null, 2), function(err) {
if(err) {
console.log(err);
} else {
console.log("JSON saved to " + outputFilename);
}
});
});