javascript - 使用流逐行读取文本文件

标签 javascript node.js

我需要逐行读取文本文件,执行一些操作并写入输出文件。

由于文件相当大(可能超过 100MB),建议使用流来提高性能。

我编写了以下函数来读取文件,但 block 的大小是恒定的,因此它并不总是包含一行或精确的多行。

function loadLogFileInfo(inputFilename, outputFilename) {
    return new Promise((resolve, reject) => {
        let inputStream = fs.createReadStream(inputFilename, "utf8");
        let outputStream = fs.createWriteStream(outputFilename);

        inputStream.on("error", () => {
            outputStream.end();
            reject();
        });
        inputStream.on("end", () => {
            outputStream.end();
            resolve();
        });

        inputStream.on("data", (chunk) => {
            let data = "";
            // Compute some data on the row and put in data variable
            outputStream.write(data + "\n");
        });
    });
}

我还发现了this question这解决了二进制文件的问题,但由于在本例中它是一个文本文件,也许可以有一个更简单的解决方案。

最佳答案

您可以使用split (NPM 上提供)可以很好地处理这个问题。您可以看到GitHub上使用的代码。以下示例读取您的输入并将其逐行写入输出流。

const split = require('split');

function loadLogFileInfo(inputFilename, outputFilename) {
  return new Promise((resolve, reject) => {
    let inputStream = fs.createReadStream(inputFilename, "utf8").pipe(split());
    let outputStream = fs.createWriteStream(outputFilename);

    inputStream.on("error", () => {
      outputStream.end();
      reject();
    });
    inputStream.on("end", () => {
      outputStream.end();
      resolve();
    });
    inputStream.on("data", (line) => {
      outputStream.write(line + "\n");
    });
  });
}

关于javascript - 使用流逐行读取文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54131119/

相关文章:

javascript - 点击Open Layer中的图层时的回调

javascript - UIWebView 和 JavaScript

javascript - 如何限制两次调用js append 功能

javascript - 图表上的高点和低点被切断

mysql - 使用 express-mysql-session 验证

node.js - 如何处理 node.js 中的错误

javascript settimeout更改函数调用中的延迟

javascript - 同构 JS - 变量在客户端不可用

javascript - 类型错误:myParser.MessageParser 不是构造函数

node.js - SendGrid API key 不起作用。 "The provided authorization grant is invalid, expired or revoked"