Массив не имеет ожидаемого значения - Nodejs

Я запускаю скрипт, который просматривает каталог и выводит список файлов, затем проверяет тип файла для обработки, если расширение совпадает, то файл читается, и каждая строка файла (.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, так как я почти уверен, что мне здесь не хватает чего-то базового.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.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);

Другие вопросы по теме