Рубрики
Без рубрики

Чтение линии файлов по строке в Node.js

Автор оригинала: Vasyl Lagutin.

Вступление

В информатике файл является ресурсом, используемым для записи данных дискретически в запоминающем устройстве компьютера. Node.js не переопределяет это никак и работает с тем, что считается файлом в вашей файловой системе.

Чтение файлов и ресурсов имеют много использований:

  • Статистика, аналитика и отчеты
  • Машинное обучение
  • Работа с большими текстовыми файлами или журналами

Иногда эти файлы могут быть нелепо большими, с помощью гигабайт или терабайт, которые хранятся, и чтение их через них неэффективно.

Возможность прочитать файловую строку по строке дает нам возможность искать только соответствующую информацию и остановить поиск, как только мы нашли то, что мы ищем. Это также позволяет нам распускать данные на логические части, как если файл был CSV-отформатирован.

Readline (от V0.12 и ON)

Node.js имеет родной модуль для чтения файлов, которые позволяют нам читать строку. Он был добавлен в 2015 году и предназначен для чтения из любого Читаемый поток одна строка за раз.

Этот факт делает его универсальным вариантом, подходящим не только для файлов, но даже входы командной строки, как Process.Stdin Отказ Документация на readline Модуль можно найти здесь Отказ

Как readline это родной модуль. Вам не нужно использовать NPM Для любого другого менеджера пакета добавить его, просто требуется :

const readline = require('readline');

И ты хорош, чтобы пойти!

Как readline Метод должен быть снабжен поток, мы должны сначала создать его, используя другой родной модуль – ФС :

const fs = require('fs');

Следующим шагом является создание объекта, который будет читать из потока, используя createinterface () Функция:

const readInterface = readline.createInterface({
    input: fs.createReadStream('/path/to/file'),
    output: process.stdout,
    console: false
});

Убедитесь, что вы заменяете /путь/к/файл с фактическим путем к файлу в вашей файловой системе.

После того, как препарат будет сделан – чтение файловой строки и печати его контента к консоли может быть сделано:

readInterface.on('line', function(line) {
    console.log(line);
});

Здесь мы по сути говорим, что всякий раз, когда линия событие происходит в readinterface Он должен вызывать нашу функцию и пройти его содержимое, прочитанное из потока. В нашем случае мы не хотим преодолевать вещи и просто распечатать его в консоль.

Считыватель

После подробного объяснения того, как вы можете прочитать строку файловой строки с использованием собственного модуля Node.js, давайте посмотрим на более короткую версию его, используя Open-Source Средстворитель модуль из NPM.

Поскольку это не роднический модуль, нам нужно убедиться, что мы правильно инициализировали проект NPM с помощью NPM init а затем установить его:

$ npm install --save line-reader

Это установит зависимость и добавьте его в Package.json файл.

Как только это будет сделано, чтение файловой строки аналогична предыдущему примеру, только без создания readinterface посередине:

const lineReader = require('line-reader');

lineReader.eachLine('/path/to/file', function(line) {
    console.log(line);
});

Вполне полезная функция здесь – прекратить чтение, когда некоторое состояние поворачивается. Это достигается просто возвращением ложь из функции обратного вызова.

Например, мы могли бы прочитать файловую строку по строке, пока не найдем строку, которая имеет слово «Стоп» в нем:

lineReader.eachLine('path/to/file', function(line) {
    console.log(line);
    if (line.includes('STOP') {
        return false; // stop reading
    }
});

Там есть немного другой подход, который использует два вложенных обратных вызова и синтаксис, который может показаться более естественным для разработчиков Java:

lineReader.open('/path/to/file', function(reader) {
    if (reader.hasNextLine()) {
        reader.nextLine(function(line) {
            console.log(line);
        });
    }
});

Здесь мы используем Открыть () Функция, которая не предоставляет нам строки из файла мгновенно, но она скорее дает нам Читатель Отказ Он имеет свой собственный набор функций, таких как Hasnextline () и () которые позволяют нам иметь немного более контроля над процессом чтения файловой строки в Node.js.

N-ReadLines.

Различный синтаксис предоставляется модулем NPM n-readlines :

Давайте установим это:

$ npm install --save n-readlines

И требовать:

const lineByLine = require('n-readlines');

Чтобы иметь возможность прочитать из файла, мы должны создать новый объект, предоставляя путь к нашему файлу как аргумент:

const liner = new lineByLine('/path/to/file');

Получение строк из файла сделано, позвонив Следующий Функция:

let line;
 
while (line = liner.next()) {
    console.log(line);
}

Интересная функция n-readlines Модуль это Сброс () Отказ Он сбрасывает указатель и начинает процесс чтения с самого начала файла.

Примечание : Это работает только в том случае, если конец не достигнут.

Распространенные ошибки

Общая ошибка при чтении файловой строки в Node.js является чтение всего файла в память, а затем разделение его контента по разрывам строки.

Вот и неверный Пример, который может перегружать вашу систему, если вы предоставляете ему достаточно большой файл:

require('fs').readFileSync('/path/to/file', 'utf-8').split(/\r?\n/).forEach(function(line) {
    console.log(line);
});

На первый взгляд, кажется, что вывод одинаково для этого подхода, так и для предыдущих, и на самом деле, он работает нормально для небольших файлов. Но посмотри и попробуй работать с большим. Это определенно не то, что вы хотите увидеть в вашей производственной системе.

Заключение

Существуют несколько способов чтения строки файловой строки в Node.js, и выбор соответствующего подхода является полностью решением программиста.

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