Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как читать файл построчно в Node.js

Короткий ответ

Для небольших файлов прочитайте содержимое и разбейте на строки:

import { readFile, writeFile } from 'node:fs/promises';
 
await writeFile('names.txt', 'Anna\nOleg\nMaria\n');
 
const lines = (await readFile('names.txt', 'utf8')).split(/\r?\n/).filter(Boolean);
console.log(lines.length, lines[1]);

Результат:

3 Oleg

Большие файлы

Большой файл не стоит загружать в память целиком. readline читает его потоком, по одной строке:

import { createReadStream } from 'node:fs';
import { writeFile } from 'node:fs/promises';
import { createInterface } from 'node:readline';
 
await writeFile('access.log', 'GET /\nPOST /login\nGET /about\n');
 
const lines = createInterface({ input: createReadStream('access.log'), crlfDelay: Infinity });
let count = 0;
for await (const line of lines) {
  if (line.startsWith('GET')) count++;
}
 
console.log('GET requests:', count);

Результат:

GET requests: 2

Частая ошибка

Без crlfDelay: Infinity окончание строки Windows \r\n может разделиться на два перевода строки. А forEach() у потока нет — используйте for await.

// count-lines.js
const lines = createInterface({ input: createReadStream('access.log'), crlfDelay: Infinity });
 
for await (const line of lines) {
  console.log(line);
}

Функции из этого ответа

  • for await...of — Перебирает асинхронные источники данных, дожидаясь каждого элемента.
  • String.prototype.split — Разбивает строку на массив по разделителю.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.