0

我正在使用lazyfs逐行读取文件(参考):

Lazy = require('lazy');
fs = require('fs');

lazy = new Lazy(fs.createReadStream(filename, {
  encoding: 'utf8'
}));

lazy.lines.forEach(function(line) {
  line = String(line);
  // more stuff...
}

奇怪的是,当读取一个空行时,String(line)结果是 string 0。这是一个问题,因为我找不到一种方法来区分0是空行的结果,还是该行实际上包含单个字符0

为什么会这样?以及如何解决这个问题?

4

1 回答 1

4

这肯定是 Lazy 模块中的一个错误,我可以重现它。

问题是这一行

finalBufferLength = buffers.reduce(function(left, right) { return (left.length||left) + (right.length||right); }, 0);

那里有一个隐式字符串转换(所以数字0被转换为字符串"0"),因为这修复了它:

finalBufferLength = buffers.reduce(function(left, right) { return Number(left.length||left) + Number(right.length||right); }, 0);

似乎 Lazy 仅使用 DOS 样式的行尾进行了测试,因为当我将这些文件提供给它时​​,它工作得很好。正因为如此,作为一个快速修复,我认为你可以使用这个:

lazy
  .map(function(chunk) {
    // replace Unix-style (LF) line ending with DOS-style (CRLF)
    return chunk.replace(/(?!\r)\n/g, '\r\n');
  })
  .lines
  .forEach(function(line) {
    console.log('L', line.toString());
  });
于 2013-05-26T06:07:55.173 回答