typestar

Leer líneas en JavaScript

readline convierte un stream en líneas, sin cargar el archivo.

import { createReadStream } from "node:fs";
import { mkdtemp, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { createInterface } from "node:readline";

const dir = await mkdtemp(join(tmpdir(), "lines-"));
const path = join(dir, "log.txt");
await writeFile(path, "INFO start\nWARN slow\nINFO done\n");

const lines = createInterface({
  input: createReadStream(path),
  crlfDelay: Infinity,
});

const counts = new Map();
for await (const line of lines) {
  const level = line.split(" ")[0];
  counts.set(level, (counts.get(level) ?? 0) + 1);
}
console.log([...counts.entries()].sort());

Cómo funciona

  1. crlfDelay: Infinity trata CRLF como un solo salto.
  2. La interfaz es un iterable asíncrono.
  3. Así se procesa un log más grande que la memoria.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
21
Caracteres a escribir
643
Tokens
160
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 91 segundos.

Escribe este fragmento

Paso 2 de 2 en Streams y líneas; paso 6 de 18 en Node.js.

← Anterior Siguiente →