NodeJS 如何在JavaScript中逐行读取文本文件?

6uxekuva  于 11个月前  发布在  Node.js
关注(0)|答案(3)|浏览(145)

我需要用JavaScript逐行读取一个文本文件。
我可能想对每一行做些什么(例如跳过或修改它),并将该行写入另一个文件。但具体的操作超出了这个问题的范围。
有许多问题都有类似的措辞,但大多数实际上是一步将整个文件读入内存,而不是逐行阅读。因此,这些解决方案无法用于较大的文件。

pkmbmrz7

pkmbmrz71#

Node.js在v18.11.0中添加了一个新功能,可以逐行读取文件

  • filehandle.readLines([options])

这是你如何使用这个与一个文本文件,你想读

import { open } from 'node:fs/promises';
myFileReader();
async function myFileReader() {
    const file = await open('./TextFileName.txt');
    for await (const line of file.readLines()) {
        console.log(line)
    }
}

字符串
要了解更多信息,请阅读Node.js文档,这里是文件系统readlines()的链接:https://nodejs.org/api/fs.html#filehandlereadlinesoptions

pdkcd3nj

pdkcd3nj2#

逐行读取文本文件的代码确实令人惊讶地不平凡,而且很难发现。
此代码使用NodeJS的readline模块逐行读取和写入文本文件。它可以处理大文件。

const fs = require("fs");
const readline = require("readline");

const input_path = "input.txt";
const output_path = "output.txt";

const inputStream = fs.createReadStream(input_path);
const outputStream = fs.createWriteStream(output_path, { encoding: "utf8" });
var lineReader = readline.createInterface({
  input: inputStream,
  terminal: false,
});
lineReader.on("line", function (line) {
  outputStream.write(line + "\n");
});

字符串

eoigrqb6

eoigrqb63#

下面是MDN文档中的一个函数,它向您展示了如何使用ReadableStream逐行读取File。这与node.js和Web浏览器都兼容。这个示例使用fetch,但如果您已经有File,则可以调用stream()getReader()

async function* makeTextFileLineIterator(fileURL) {
  const utf8Decoder = new TextDecoder("utf-8");
  let response = await fetch(fileURL);
  let reader = response.body.getReader();
  let { value: chunk, done: readerDone } = await reader.read();
  chunk = chunk ? utf8Decoder.decode(chunk, { stream: true }) : "";

  const re = /\r\n|\n|\r/gm;
  let startIndex = 0;

  for (;;) {
    const result = re.exec(chunk);
    if (!result) {
      if (readerDone) {
        break;
      }
      const remainder = chunk.substr(startIndex);
      ({ value: chunk, done: readerDone } = await reader.read());
      chunk =
        remainder + (chunk ? utf8Decoder.decode(chunk, { stream: true }) : "");
      startIndex = re.lastIndex = 0;
      continue;
    }
    yield chunk.substring(startIndex, result.index);
    startIndex = re.lastIndex;
  }
  if (startIndex < chunk.length) {
    // last line didn't end in a newline char
    yield chunk.substr(startIndex);
  }
}

for await (let line of makeTextFileLineIterator(urlOfFile)) {
  processLine(line);
}

字符串

相关问题