Node.js 从textfile读取第一行而不将整个textfile加载到内存中

Node.js 从textfile读取第一行而不将整个textfile加载到内存中,node.js,readline,Node.js,Readline,我有大量的小文本文件,其中前4行或更少的行包含元数据;下面是一个例子 同侧眼睑 Tag1 Tag2 Tag3 正文 4204 ‎‎‎‎‎‎ 知识是一种美德,是一种美德,是一种美德,是一种美德。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡 同侧眼底;将是标题 Tag1、Tag2和Tag3;将是一个标签数组 文本;会是那种类型吗 4204;那就是身份证 同侧眼底[…];将是实际内容 我需要加载元数据而

我有大量的小文本文件,其中前4行或更少的行包含元数据;下面是一个例子

同侧眼睑

Tag1 Tag2 Tag3

正文

4204

‎‎‎‎‎‎

知识是一种美德,是一种美德,是一种美德,是一种美德。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡

  • 同侧眼底;将是标题
  • Tag1、Tag2和Tag3;将是一个标签数组
  • 文本;会是那种类型吗
  • 4204;那就是身份证
  • 同侧眼底[…];将是实际内容
我需要加载元数据而不加载实际内容。我在node.js中工作。我编写了以下代码:

函数readMeta(路径,回调){ 常量meta={}; const lineReader=require(“readline”).createInterface({input:require(“fs”).createReadStream(path)}); 设lineCount=0; 让我们来解释一下德梅塔; lineReader.on(“line”,line=>{ 解释器梅塔=解释器梅塔(行,行计数) 交换机(线路计数){ 案例0: meta.name=dmeta; 打破 案例1: meta.tags=解释器meta.split(“”); 打破 案例2: meta.type=dmeta; 打破 案例3: meta.id=dmeta; } ++行数; 如果(/^\s*$/.test(行)){ lineReader.close(); } }); lineReader.on(“关闭”()=>{ 回调(meta); 进程退出(0); }); } 其中
interpretatMeta()
是一个函数,它根据行号格式化给定的字符串。稍后我将把它集成到
readMeta()
中,因为它有些冗余

问题 这段代码只处理一个文件,但如果它在短时间内运行多次,就会出现错误。它到达第二行,但每次函数运行时都会重新开始

我不能100%确定为什么会发生这种情况,但我假设类似于
lineReader.on()
的回调函数不会复制它从
readMeta
中获取的变量。但我不知道如何调试或解决

修理 我没有使用异步函数的任何经验,因此如果我使用了错误的术语,我深表歉意:我相信解决我的问题的一种方法是使用同步
readline()
函数读取流中的下一行。但我不知道该怎么做,所以我的问题是我该怎么做:

A:修复代码

B:创建一个同步的“readline”函数

感谢

对最初的帖子发表评论,问你是否愿意回答我的问题。经批准的答案并非如此,但一个旁路让我走上了正确的轨道:

2019年更新

官方Nodejs文档中已经发布了一个很棒的示例

这需要在您的计算机上安装最新的Nodejs。>11.4

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

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

const rl = readline.createInterface({
   input: fileStream,
   crlfDelay: Infinity
});
// Note: we use the crlfDelay option to recognize all instances of CR LF
// ('\r\n') in input.txt as a single line break.

for await (const line of rl) {
   // Each line in input.txt will be successively available here as `line`.
   console.log(`Line from file: ${line}`);
}
}

processLineByLine();
包含我最后遵循的另一个示例,以下是我的最终代码:

异步函数readMeta(路径){ 常量meta={}; const lineReader=require(“readline”).createInterface({input:fs.createReadStream(path)}); 设currentLine=0; lineReader.on(“line”,line=>{ 开关(电流线){ 案例0: meta.name=line; 打破 案例1: meta.tags=line.split(“”); 打破 案例2: meta.type=line; 打破 案例3: meta.id=+行; } ++电流线; 如果(/^\s*$/.test(行)){ lineReader.close(); } }); 等待一次(读线器,“关闭”); 返回元; }
谢谢你的帮助。

这能回答你的问题吗?我在下面的一个答案中找到了一些我认为有用的东西,我会尝试一下,然后更新,谢谢。