【发布时间】:2020-06-13 14:05:24
【问题描述】:
我有大量的小文本文件,其中前 4 行或更少的行包含元数据;下面是一个例子
Lorem Ipsum
标签1 标签2 标签3
文字
4204
Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat。 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum。
- Lorem Ipsum;将是标题
- 标签 1、标签 2 和标签 3;将是一个标签数组
- 文本;将是类型
- 4204;将是 ID。
- Lorem ipsum [...];将是实际内容
我需要加载元数据而不加载实际内容。我在 node.js 工作。我做了以下代码:
function readMeta (path, callback) {
const meta = {};
const lineReader = require("readline").createInterface({input: require("fs").createReadStream(path)});
let lineCount = 0;
let interpretedMeta;
lineReader.on("line", line => {
interpretedMeta = interpretMeta(line, lineCount)
switch (lineCount) {
case 0:
meta.name = interpretedMeta;
break;
case 1:
meta.tags = interpretedMeta.split(" ");
break;
case 2:
meta.type = interpretedMeta;
break;
case 3:
meta.id = interpretedMeta;
}
++lineCount;
if (/^\s*$/.test(line)) {
lineReader.close();
}
});
lineReader.on("close", () => {
callback(meta);
process.exit(0);
});
}
其中interpretMeta() 是一个根据行号格式化给定字符串的函数。稍后我会将它整合到 readMeta() 中,因为它有些多余。
问题
此代码适用于一个文件,但如果它在短时间内运行多次,则会出现错误。它到达第二行,但每次函数运行时都会重新开始。
我不是 100% 确定为什么会发生这种情况,但我假设像 lineReader.on() 的回调不会复制从 readMeta 获得的变量。我不知道如何调试或解决。
修复
我没有任何使用异步函数的经验,所以如果我使用了错误的术语,我深表歉意:我相信解决我的问题的一种方法,我会很乐意使用,是读取下一行的同步 readline() 函数在一条溪流中。我不知道该怎么做,所以我的问题是我该怎么做:
A:修复代码
B: 做一个同步的‘readline’函数
谢谢
【问题讨论】:
-
这能回答你的问题吗? Read a file one line at a time in node.js?
-
我发现了一些我认为可以在较低答案之一中使用的东西,将尝试并在之后更新,谢谢。