记一次Node.js读取文件数据并去重写入数据库的学习笔记

在小程序云开发和前后端统一的大势席卷下,学习Node.js已经是前端、小程序开发的必备技能了。
而且,由于小程序能够被轻松反编译的情况下,云开发能够为程序提供最后的一层保障,所以我们有必要学习Node.js。
本文为一次Node.js实现一个小功能的学习文章。

一:背景

最近手痒,于是找同事用python扒了一下某个社区的用户昵称和头像数据。
当然,并不能直接拿到别人库中的用户昵称及头像,于是扒的是发的消息,然后过滤了消息内容,留下了用户昵称和头像。
这里面重复数据有很多,于是准备用Node.js来去重,并实现以下2个目标:
1、将去重后的数据写入到新文件中
2、将去重后的数据写入数据库中。

二:数据格式

看一眼数据格式,如下图。


数据格式1.png

三:准备

首先,我们要选择模块,Node.js已经为我们准备了很多很好用的模块了。
1、涉及到读写文件的,那就必要要用fs模块。
2、涉及到数据库,于是这里用的数据库是mysql,模块选择mysql,当然用其他也是可以的。
3、此外,还需要用到readline这个模块,这个是逐行读取数据的。如果不用这个模块的话,那我们用fs读到的数据是全部的数据,我们还要对数据进行去重并写到数据库中!很显然,单单fs模块很难做到(也可以说是我水平不够,毕竟刚刚学,如果fs能够轻松做到逐行读取数据,那就欢迎指出!),最好的方式就是把数据逐行读取到数组中。

单单用fs做的一个demo,试试看。

let fs = require('fs');
fs.readFile('./test.txt','utf-8',(err,data)=>{
    if(err){
        console.log(err);
    }else{
        console.log(data);
    }
})
console.log('here is first executed');

/**
 text.txt的内容为
 Hello,Node.js
 Hello,JavaScript
 Hello,MY IDE

 可以看到,上面的小demo是读取完之后将数据以参数的形式传给回调函数的。
 最后输出的,也是全部的数据。
*/

将上方代码保存为main.js,看下它的输出截图。


main.png

四:代码解析

1、引入及定义变量

// 三个模块必须要引入
const readline = require('readline');
const fs = require('fs');
const ms = require('mysql');
let mysql; // mysql连接实例

let userInfo = []; // 将所有数据逐行push进来
let newarr = [];  // 去重后的数据数组

2、用fs模块创建读取流并让readline对象监听

具体可以看这里Node.js v10.14.2文档 readline

let input = fs.createReadStream("info2.txt");
const rl = readline.createInterface({
  input: input
});

rl.on('line', (line) => {
    // 每读取一行,都触发此监听事件
});

rl.on('close', (line) => {
    // 读取完毕之后触发
});

3、实现readline对象的2个监听事件

在这里,我们需要实现,将数据读取到数组userInfo中,并在读取完毕之后进行去重,将去重的数据保存到newarr中。

rl.on('line', (line) => {
    // 这里很简单,直接Push进userInfo中就可以了。
    userInfo.push(line);
});

rl.on('close', (line) => {
    console.log('line=' + line);
    // 去重,并读取userInfo的长度和newarr的长度
    newarr = norepeat1(userInfo);
    console.log('newarr.length = ' + newarr.length);
    console.log('userinfo.length = ' +userInfo.length);
    console.log("读取完毕!");

    // 连接数据库
    mysql =  ms.createConnection({
        host:'127.0.0.1',
        user:'root',
        password:'root',
        database:'xzw'
    })

    // 调用写方法函数(及写入数据库)
    writeNew()
});

// 去重函数
function norepeat1(arr){
    return [...new Set(arr)];
}

给看一下userInfo和newarr的长度,可以看出,活跃的永远都是少数啊。


去重.png

4、实现写方法writeNew

到这一步,我们已经成功了一半了。

function writeNew(){
    newarr.forEach(element => {
        // 插入数据库
        let line = element;

        // 解析出需要的数据
        let [namestr,avatarstr] = line.split(';');
        let name = namestr.split('=')[1];
        let avatar = avatarstr.split('=')[1];

        // 构造sql
        let querystr = 'insert into qsbk_user(username,avatar) value(?,?)';
        let params = [name,avatar];
        mysql.query(querystr,params,function(err,result){
            if(err){
                // 在这里我们可以将失败的消息输出,然后执行完毕后可以手动处理这部分问题。
                // 这里如果用的是for的话,还可以直接定位到行哦
                console.log('errormessage=' + err.message);
                console.log('error,name=' + name + ';avatar=' + avatar);
            }
            // else 没有消息就是最大的好消息
        })

        // 写入文件
        // 写文件的时候需要注意2点
        //1、window需要在每行数据之后拼接  "\r\n",不然不会自动换行, linux "\n"  mac "\r"
        //2、fs用的是appenFile才会在文本文件的后边添加,用writeFile是覆盖添加。
        let content = element + "\r\n";
        fs.appendFile('ouput.txt',content,function(err,data){
            // 
        })
    });
}

看一看数据库记录截图。


数据库.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341