【问题标题】:Node.js how to read one line of numbers from a file into an arrayNode.js如何将文件中的一行数字读入数组
【发布时间】:2012-09-15 01:21:32
【问题描述】:

我有一个家庭作业,我有一个数字文件要读入一个数组,然后用它们做一些事情。

现在,我的问题不是读取文件。我知道该怎么做。我不确定的是如何让它将一行读入数组,以便程序可以做我应该做的任何事情,并在处理完该行数字后读取下一行.

txt 文件非常大,每行大约有 90 个数字,每行以换行结束。

任何关于如何使程序一次只读取一行到数组中的提示将不胜感激。谢谢。

【问题讨论】:

  • 您必须阅读整个文件,然后将其分成几行。
  • 文件太大有更好的解决办法。
  • 创建一个流并将其传递给 Lazy:stackoverflow.com/questions/6156501/…
  • 在使用更复杂的解决方案之前,请确保文件确实太大而无法放入内存。

标签: node.js


【解决方案1】:

如果文件很大,我认为最简单的方法是使用fs.Readstream

var fs = require('fs');

var
  remaining = "";
  lineFeed = "\n",
  lineNr = 0;

fs.createReadStream('data.txt', { encoding: 'utf-8' })
  .on('data', function (chunk) {
    // store the actual chunk into the remaining
    remaining = remaining.concat(chunk);

    // look that we have a linefeed
    var lastLineFeed = remaining.lastIndexOf(lineFeed);

    // if we don't have any we can continue the reading
    if (lastLineFeed === -1) return;

    var
      current = remaining.substring(0, lastLineFeed),
      lines = current.split(lineFeed);

    // store from the last linefeed or empty it out
    remaining = (lastLineFeed > remaining.length)
      ? remaining.substring(lastLineFeed + 1, remaining.length)
      : "";

    for (var i = 0, length = lines.length; i < length; i++) {
      // process the actual line
      _processLine(lines[i], lineNr++);
    }
  })
  .on('end', function (close) {
    // TODO I'm not sure this is needed, it depends on your data
    // process the reamining data if needed
    if (remaining.length > 0) _processLine(remaining, lineNr);
  });

function _processLine(line, lineNumber) {
  // UPDATE2 with parseFloat
  var numbers = line.split(" ").map(function (item) { return parseFloat(item); });
  console.log(numbers, lineNumber);
}

【讨论】:

  • KARASZI,您的示例是使文件中的每一行成为名为“lines”的数组中的元素,还是使行中的每个数字成为元素?如果它是第一个,我怎么能把每一行分成一个数组,每个数字都是一个元素?
  • 我刚刚重读了我的原始帖子,听起来我确实要求每一行都成为数组中的一个元素。对于那个很抱歉。我想做的是让脚本读取一行并停止。将行分成一个数组,每个数字都是数组中的一个元素。在数组上完成计算后,将其清除,然后移至下一行并将其分解并将该行中的每个数字放入数组中。文件中的每一行都有大约 90 个数字,所以我将有一个包含 90 个元素的数组,这些元素将被文件中的每一行重用。
  • 这不是 Node.js 的做事方式。您不会停止,它是面向事件的。
  • 感谢更新,这就是我昨晚发布后想出的。在流程线功能中拆分线。你能同时做到这一点和 parseFloat 吗?像 var numbers = parseFloat(line.split(" ")) 或类似的东西?
  • 对于 'remaining = remaining.concat(chunk);' 行我得到一个错误。 TypeError:无法调用未定义的方法“concat”。知道那里发生了什么吗?
猜你喜欢
  • 2023-03-22
  • 2011-10-13
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多