Массив не имеет ожидаемого значения - Nodejs - PullRequest
0 голосов
/ 04 марта 2019

Я запускаю скрипт, который просматривает каталог и выводит список файлов, а затем проверяет тип файла для обработки, если расширение совпадает, то файл читается и каждая строка файла (.col, который является просто текстовым файломпереименовано) вставляется в массив.

Теперь, когда файл прочитан и массив заполнен, я хотел бы использовать массив и выполнить дополнительную обработку, например, создать запись в БД.Я упускаю что-то действительно простое здесь, потому что в каждом журнале консоли я делаю так, как показано ниже, я всегда получаю полные элементы (в моем массиве) содержимого всех файлов.

Итак, чтобы сделать это немного проще: массив пуст.Затем файл читается и обрабатывается, и массив теперь имеет массив [0] = строка 0 массива файла [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); 
      });

}

}

Вместо этого выполняется скрипти массив [] содержит все строки всех файлов, которые соответствуют расширению.

Ваша помощь очень ценится, и каждому разрешают опалить мой JS, так как я почти уверен, что здесь что-то не хватает.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Если ваши файлы не очень большие и методы синхронизации в порядке, вы можете упростить код следующим образом:

'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);
0 голосов
/ 04 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...