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
crlfDelay: Infinitytrata CRLF como un solo salto.- La interfaz es un iterable asíncrono.
- Así se procesa un log más grande que la memoria.
Palabras clave y builtins usados aquí
Mapawaitconstforfromimportof
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.
Paso 2 de 2 en Streams y líneas; paso 6 de 18 en Node.js.