Nodejs中readline处理日志文本很方便
Nodejs中readline处理日志文本很方便
###扯淡 我也快要成了 跑数据专业户
最近做的一些事儿:抓取原始数据,记到monogo里,按照不同格式导出,进一步加工……
Linux技法中,awk应该是必知必会,但实在是记不住这么怪异的参数格式……
###正文 nodejs自带的readline可以实现逐行处理,每行一个json,处理方式非常灵活
命令行里这样用:
cat logfile.txt | node main.js
main.js中这样写:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false //这个参数很重要
});
rl.on(‘line’, function(line){
var obj = JSON.parse(line);
//按需处理
console.log(…);
});
通过“管道”把文本内容灌入nodejs的标准输入,简洁清晰,处理过程可以任意复杂!
注意 terminal: false 这个参数很重要,如果不指定false,node会认为输入来自TTY终端(命令行),这种情况下Tab(\t)符号是自动补全的意思,结果就是: 接收到的line值,所有的Tab号都消失了!
小小分享,希望能帮到小伙伴呢。
Nodejs中readline处理日志文本很方便
扯淡
我也快要成了 跑数据专业户。
最近做的一些事儿:抓取原始数据,记到MongoDB里,按照不同格式导出,进一步加工……
Linux技法中,awk
应该是必知必会,但实在是记不住这么怪异的参数格式……
正文
Node.js自带的readline
模块可以实现逐行处理,每行一个JSON对象,处理方式非常灵活。
使用示例
假设你有一个日志文件logfile.txt
,每行都是一个JSON对象。你可以使用以下命令将日志文件的内容通过管道传递给Node.js程序进行逐行处理:
cat logfile.txt | node main.js
main.js 示例代码
在main.js
文件中,你可以这样编写代码来处理这些JSON对象:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false // 这个参数很重要
});
rl.on('line', (line) => {
try {
const obj = JSON.parse(line);
// 按需处理
console.log(obj); // 输出处理后的对象
} catch (error) {
console.error(`Error parsing line: ${line}`, error);
}
});
rl.on('close', () => {
console.log('Finished reading the file.');
});
解释
-
创建 readline 接口:
const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false // 这个参数很重要 });
input: process.stdin
:表示读取标准输入。output: process.stdout
:表示输出到标准输出。terminal: false
:表示输入不是来自TTY终端,避免Tab键自动补全问题。
-
监听行事件:
rl.on('line', (line) => { try { const obj = JSON.parse(line); console.log(obj); // 输出处理后的对象 } catch (error) { console.error(`Error parsing line: ${line}`, error); } });
- 每当读取到一行时,触发
'line'
事件。 - 尝试将该行解析为JSON对象,并输出处理后的对象。
- 如果解析失败,则捕获错误并打印错误信息。
- 每当读取到一行时,触发
-
关闭事件:
rl.on('close', () => { console.log('Finished reading the file.'); });
- 当所有行都读取完毕时,触发
'close'
事件。
- 当所有行都读取完毕时,触发
通过这种方式,你可以方便地逐行处理日志文件中的每一行JSON数据。这种方式不仅简洁清晰,而且处理过程非常灵活,可以根据需求进行复杂的逻辑处理。希望这个示例能帮助到需要处理日志文件的小伙伴们。
mark
// TODO 试一下
Nodejs中readline处理日志文本很方便
正文
Node.js 自带的 readline
模块非常适合逐行处理文本文件,特别是在处理日志文件时。下面是一个简单的例子来说明如何使用 readline
模块来逐行读取并解析日志文件中的每一行。
假设我们的日志文件 logfile.txt
每一行都是一个 JSON 字符串。
cat logfile.txt | node main.js
在 main.js
中我们可以这样写:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false // 这个参数很重要
});
rl.on('line', function(line) {
try {
var obj = JSON.parse(line);
// 按需处理
console.log(obj); // 打印解析后的对象
} catch (err) {
console.error(`Failed to parse line: ${line}`, err);
}
});
rl.on('close', function() {
console.log('All lines processed');
});
通过管道将日志文件的内容传递给 node
命令,readline
模块会逐行读取这些内容。这里的关键在于设置 terminal: false
参数,这使得 readline
不会将输入视作 TTY 终端输入,从而避免了 Tab 键被自动补全的问题。
以上代码中的 rl.on('line', ...)
回调函数会在每次读取到新行时被调用,并且该行的内容会被解析为 JSON 对象。你可以根据需要进一步处理这些对象。如果某一行无法解析为 JSON,程序会输出错误信息并继续处理下一行。
希望这个示例能够帮助大家更好地理解和使用 Node.js 的 readline
模块来处理日志文件等文本数据。