节点逐行读取,处理和存储

时间:2018-02-23 10:07:01

标签: javascript json node.js

我在Node.js中有以下代码,它逐行从文件中读取。我想对每一行做一些事情并将其存储在一个数组中。然后,该数组将用于同一文件中的其他函数。我遇到的问题是读取流的异步性质导致空数组。我遇到的解决方案似乎都依赖于模块。

function processLine(file) {
  const fs = require('fs');
  const readline = require('readline');
  const input = fs.createReadStream(file);
  const rl = readline.createInterface(input);
  const arr = []

  rl.on('line', (line) => {
    // do stuff to data and store in array
  })
  // return array;
}

我知道能够存储块并使用input.on('end', cb)...对整个文件进行操作。但是,我觉得这会在cb中放置太多功能。此外,由于异步,我仍然无法使用其返回值。我想我的问题是,有没有办法存储正在读取的数据并在文件中使用它?

1 个答案:

答案 0 :(得分:0)

如果您想处理像块一样的元素 - 请查看

highWaterMark 

https://nodejs.org/api/stream.html#stream_types_of_streams

你可能会被输入:

objectMode 

还有一些接口可以在使用流时使用:

Readable
Writable
Duplex
Transform

https://nodejs.org/api/stream.html#stream_transform_transform_chunk_encoding_callback

您可以使用任何基于Promise的函数,只需使用回调在正确的时间点完成处理元素:

 _transform = function(data, encoding, callback) {
    this.push(data);
    callback();
 };

https://nodejs.org/api/stream.html#stream_class_stream_transform

_write(chunk, encoding, callback) {
    // ...
 }

然而,还有另一种解决方案 - 节点流的rxjs绑定 - 您可以在处理元素时使用它。