我正在运行一个脚本,该脚本查找目录并列出文件,然后检查要处理的文件类型,如果扩展名匹配,则读取文件,并读取文件的每一行(.txt只是一个txt文件)重命名)插入到数组中。
现在,在读取文件并填充数组之后,我想使用该数组并进行一些进一步的处理,例如创建db记录。我在这里遗漏了一些非常基本的东西,因为在每个控制台日志上,我都按如下方式进行操作,总是获得所有文件内容的完整项目(在我的数组中)。
因此,使其变得更简单: 数组为空。 然后读取并处理文件,数组现在具有 array [0] =文件的第0行 array [0] =文件等的第1行
const fs = require('fs');
const readline =require('readline');
var files = fs.readdirSync('/home/proj/data');
var path = require('path');
var model=[];
var lineReader=[];
for(var i=0; i<files.length; i++) {
if(path.extname(files[i]) === ".col") {
lineReader[i] = readline.createInterface({
input: require('fs').createReadStream(files[i])
});
lineReader[i].on('line', function (line) {
model.push(line);
}).on('close', async function() {
console.log(model);
});
}
}
而是运行脚本,并且array []保留与扩展名匹配的所有文件的所有行。
非常感谢您的帮助,任何人都可以烤我的JS,因为我敢肯定,我在这里缺少一些基本知识。
答案 0 :(得分:2)
那么,您想并行读取文件(因为这就是您的程序所做的),然后将其放入数组数组中?
您可以使读取文件机制成为一种承诺,并使用Promise.all
来使用它。这是一个入门的示例。
const fs = require('fs');
const readline = require('readline');
var files = fs.readdirSync('./');
var path = require('path');
function readFile(fileName) {
return new Promise(resolve => {
const array = [];
const lineReader = readline.createInterface({
input: fs.createReadStream(files[i])
});
lineReader.on('line', function (line) {
array.push(line);
}).on('close', async function () {
//do some proc
console.log(array);
resolve(array);
});
});
}
const readFilePromises = [];
for (var i = 0; i < files.length; i++) {
if (path.extname(files[i]) === ".js") {
readFilePromises.push(readFile(files[i]));
}
}
Promise.all(readFilePromises) //or await Promise.all([..])
.then(data => {
console.log(data);//will be array of arrays
})
如果您要一个Array
,则可以始终使用data.flat()
来平整结果
答案 1 :(得分:1)
如果文件不是很大,并且同步方法还可以,则可以通过以下方式简化代码:
'use strict';
const fs = require('fs');
const path = require('path');
const model = [];
fs.readdirSync('/home/proj/data')
.filter(name => path.extname(name) === '.col')
.forEach((name) => {
model.push(...fs.readFileSync(name, 'utf8').split('\n'));
});
console.log(model);