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号都消失了!

小小分享,希望能帮到小伙伴呢。


5 回复

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.');
});
解释
  1. 创建 readline 接口

    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
        terminal: false  // 这个参数很重要
    });
    
    • input: process.stdin:表示读取标准输入。
    • output: process.stdout:表示输出到标准输出。
    • terminal: false:表示输入不是来自TTY终端,避免Tab键自动补全问题。
  2. 监听行事件

    rl.on('line', (line) => {
        try {
            const obj = JSON.parse(line);
            console.log(obj);  // 输出处理后的对象
        } catch (error) {
            console.error(`Error parsing line: ${line}`, error);
        }
    });
    
    • 每当读取到一行时,触发'line'事件。
    • 尝试将该行解析为JSON对象,并输出处理后的对象。
    • 如果解析失败,则捕获错误并打印错误信息。
  3. 关闭事件

    rl.on('close', () => {
        console.log('Finished reading the file.');
    });
    
    • 当所有行都读取完毕时,触发'close'事件。

通过这种方式,你可以方便地逐行处理日志文件中的每一行JSON数据。这种方式不仅简洁清晰,而且处理过程非常灵活,可以根据需求进行复杂的逻辑处理。希望这个示例能帮助到需要处理日志文件的小伙伴们。


感谢分享

// 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 模块来处理日志文件等文本数据。

回到顶部