精彩文章免费看

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

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

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

二:数据格式

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

首先,我们要选择模块,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,看下它的输出截图。

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的长度,可以看出,活跃的永远都是少数啊。

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){

看一看数据库记录截图。