Node.js 从textfile读取第一行而不将整个textfile加载到内存中
我有大量的小文本文件,其中前4行或更少的行包含元数据;下面是一个例子 同侧眼睑 Tag1 Tag2 Tag3 正文 4204 知识是一种美德,是一种美德,是一种美德,是一种美德。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡Node.js 从textfile读取第一行而不将整个textfile加载到内存中,node.js,readline,Node.js,Readline,我有大量的小文本文件,其中前4行或更少的行包含元数据;下面是一个例子 同侧眼睑 Tag1 Tag2 Tag3 正文 4204 知识是一种美德,是一种美德,是一种美德,是一种美德。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡 同侧眼底;将是标题 Tag1、Tag2和Tag3;将是一个标签数组 文本;会是那种类型吗 4204;那就是身份证 同侧眼底[…];将是实际内容 我需要加载元数据而
- 同侧眼底;将是标题
- Tag1、Tag2和Tag3;将是一个标签数组
- 文本;会是那种类型吗
- 4204;那就是身份证
- 同侧眼底[…];将是实际内容
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();
}
});
等待一次(读线器,“关闭”);
返回元;
}
谢谢你的帮助。这能回答你的问题吗?我在下面的一个答案中找到了一些我认为有用的东西,我会尝试一下,然后更新,谢谢。