node.js - NodeJS:如何在从文件解析之前读取和修改缓冲区数据?
问题描述
在 NodeJS 中,我有一个日志文件,其中我的日志格式为:
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
这些基本上是对象,用逗号分隔。我需要做的是读取此文件的内容并将日志转换为对象数组(我可以稍后操作)。
我正在尝试类似的东西:
let fileLogs = "./data/myfile.log";
fs.readFile(fileLogs, (err, fileLogsContent) => {
if (err) {
console.log("cannot read log file");
return;
}
//I know I need to manipulate the fileLogsContent here, before doing JSON.parse
let logsContent = { ...JSON.parse(fileLogsContent) };
//do something here with the array of objects 'logsContent'
});
由于日志文件中的内容不是可以解析的格式,所以上述JSON.parse
失败。我的想法是将日志文件采用以下格式:
[
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}},
{"time":"2021-09-23T11:36:18.076Z","type":"info","message":"some message","data":{"id":123}}
]
这意味着我需要在运行[
中添加第一个字符并将最后一个字符替换,
为]
. 我不知道我该怎么做,因为fileLogsContent
它实际上是一个缓冲区。那么我如何阅读内容并进行我提到的操作,以便以后能够对其进行解析并将其转化为array of objects
格式?
解决方案
您可以简单地将每一行包装在一个字符串中,然后JSON.parse
在删除尾随逗号后调用它。这是一个示例(请注意,它仍然需要对 c 进行错误处理):
const fs = require('fs');
const readline = require('readline');
const readInterface = readline.createInterface({
input: fs.createReadStream('./input.txt'),
output: undefined,
console: false
});
(async () => {
const resultArray = await new Promise((resolve, reject) => {
const chunks = [];
readInterface.on('line', (line) => {
line = line.substr(0, line.lastIndexOf(','))
chunks.push(JSON.parse(`${line}`));
})
readInterface.on('close', () => {
resolve(chunks);
})
});
console.log(resultArray);
})();
推荐阅读
- sas - 拆分字符串以处理不同的部分并再次组合回一个 var
- excel - 我正在尝试使用可变参数复制范围
- javascript - 在 hyperref 中使用表单中的 TextField 作为 href(或 PushButton)的 URL
- c++ - 在独立的 Xcode 游乐场中运行 c 或 c++ 代码
- django - 带有模板完整路径的 Django 1.11 get_template
- javascript - 更新javascript数组中的嵌套值
- c# - 如何格式化月份中没有前导零的日期?
- php - 从父表 Eloquent 返回包含所有子表的数组
- permalinks - Hugo 中的部分层次结构
- php - 如何通过 Web 套接字将 Dart Map 对象发送到 PHP 服务器?