【问题标题】:How do I cycle through each line of a text file or string, and set it to a variable in Node Js?如何循环遍历文本文件或字符串的每一行,并将其设置为 Node Js 中的变量?
【发布时间】:2021-10-17 04:45:12
【问题描述】:

我有一个带有名称的文本文件,每个名称位于不同的行。我想将第一行设置为一个变量,然后在 3 秒后,取第二行并将其设置为相同的变量,依此类推。可能会尝试使用 for 循环之类的东西。我正在使用 Node Js,并且可以使用包和其他代码等,只需要一种方法来完成这项工作。此外,我可以将文本文件内容设置为字符串,因此如果无法对文本文件进行排序,我可以使用字符串没有问题。我只需要一种方法来遍历这些行并将每个行设置为一个变量(const、var 等)。

Test.txt 示例:
凯文
鲍勃
莎莉
达拉
约翰

然后我要做的就是将第 1 行:Kevin 设置为一个字符串。 常量名称 = 凯文; 然后 3 秒后将其设置为 Bob 等。

提前致谢!

Line Reader NPM 包链接:https://www.npmjs.com/package/line-reader

将文本文件内容设置为字符串的当前代码:

var lineReader = require('line-reader');

lineReader.eachLine('Test.txt', function(text, last) {
  console.log(text);
//"text" is equal to the contents of the text file Test.txt
});

【问题讨论】:

  • let name = line
  • 抱歉,这是一个错误的变量名。行等于所有行。我会解决的。
  • 基于文档:eachLine 函数读取给定文件的每一行。在每个新行上,使用两个参数调用给定的回调函数:读取的行和指定读取的行是否是文件的最后一行的布尔值。如果回调返回 false,则停止读取并关闭文件
  • 也许在您看来它只是在打印文件内容(也许如果您没有意识到eachLine 有一个自动循环?)。如果你console.log("name:", text); 可能会更明显?
  • 是的,它确实为每一行添加了名称,但它随后将行作为所有行发送,只是前面有名称。

标签: node.js arrays string sorting


【解决方案1】:

你可以试试readline内部模块(file reading example)。

CJS 变体:

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

function sleep(time) {
  return new Promise((resolve) => {
    setTimeout(resolve, time);
  });
}

async function processLineByLine() {
  const fileStream = fs.createReadStream('test.txt');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });

  for await (const line of rl) {
    console.log(line);
    await sleep(3000);
  }
}

processLineByLine();

具有顶级await的ESM变体:

import fs from 'fs';
import readline from 'readline';

function sleep(time) {
  return new Promise((resolve) => {
    setTimeout(resolve, time);
  });
}

const fileStream = fs.createReadStream('test.txt');

const rl = readline.createInterface({
  input: fileStream,
  crlfDelay: Infinity
});

for await (const line of rl) {
  console.log(line);
  await sleep(3000);
}

【讨论】:

  • 在 setTimeout 函数之前它工作正常并且它给出了这个错误。 pastebin.com/8U7Fs8Cx 对不起,如果我不允许使用粘贴箱。
  • 我不确定如何使用导入。 @vsemozhebuty
  • @Poetic 看来您需要 Node.js 16 才能使用承诺的计时器。如果您无法升级,请告诉我——我会尝试制作另一个变体。
  • @Poetic 关于使用导入:dmitripavlutin.com/ecmascript-modules-nodejs
  • 我刚刚使用了 Node.js 16,但它工作得很好,谢谢!我一定会阅读有关使用导入的内容!
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多