Я запускаю скрипт, который просматривает каталог и выводит список файлов, затем проверяет тип файла для обработки, если расширение совпадает, то файл читается, и каждая строка файла (.col, который является просто переименованным файлом txt) вставлен в массив.
Теперь, после того, как файл прочитан и массив заполнен, я хотел бы использовать массив и выполнить некоторую дальнейшую обработку, например создать запись БД. Мне здесь не хватает чего-то действительно простого, потому что в каждом журнале консоли, который я делаю, как показано ниже, я всегда получаю полные элементы (в моем массиве) содержимого всех файлов.
Итак, чтобы сделать это немного проще: массив пуст. Затем файл читается и обрабатывается, и массив теперь имеет 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.info(model);
});
}
}
Вместо этого скрипт запускается, и array[] содержит все строки всех файлов, соответствующих расширению.
Ваша помощь очень ценится, и любой может сжечь мой JS, так как я почти уверен, что мне здесь не хватает чего-то базового.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Итак, вы хотите читать файлы параллельно (потому что это делает ваша программа) и помещать их в массив массивов?
Вы можете сделать механизм чтения файла обещанием и использовать его, используя 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.info(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.info(data);//will be array of arrays
})
Если вам нужен один Array, вы всегда можете сгладить результат, используя data.flat()
Если ваши файлы не очень большие и методы синхронизации в порядке, вы можете упростить код следующим образом:
'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.info(model);