• 通过脚本(awk,grep)清洗实体类数据,存入数据库


    通过脚本(awk,grep)清洗实体类数据,存入数据库

    👊一、前言

      部分数据库在建表的时候,不能像MySQL一样直接在字段后加comment对字段做注释。通过comment on column dbname.tablename.fieldname is '';的方式一个一个加字段注释较为麻烦,而一般在项目代码中都会对字段做备注,所以打算使用Linux的grep和awk写脚本进行处理,然后存入到数据库的一张表中,以便查看。
      Linux三剑客,grep擅长查找功能,sed擅长取行和替换,awk擅长取列
      如下,就简单模拟一些实体类文件进行介绍,在实际场景中也是同样的操作。

    👊二、逐步处理过程

    🙇‍♀2.1 cat实体类

      cat命令可直接在终端查看文件数据

    [root@zxy_master dao]# cat ./User.java
    package com.zxy.pojo;
    
    import java.util.Date;
    
    public class User {
        private Integer id;//ID
    
        private String email;//邮箱
    
        private String phonenum;//电话
    
        private String password;//密码
    
        private String code;//编码
    
        private String nickname;//昵称
    ...................
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    🙇‍♀2.2 grep只查看字段行

      将cat到的结果以管道的形式,传给grep做处理。使用grep只查询包含private的行

    [root@zxy_master dao]# cat ./User.java | grep private
        private Integer id;//ID
        private String email;//邮箱
        private String phonenum;//电话
        private String password;//密码
        private String code;//编码
        private String nickname;//昵称
        private String sex;//性别
        private String birthday;//出生日期
        private String address;//地址
        private String imgurl;//头像URL
        private Date createtime;//创建时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🙇‍♀2.3 awk空格切分取第三列

      将grep查询到的数据,以管道的形式的传给awk做处理。awk命令加-F,可以指定按照什么切分数据。使用print输出数据,$3可以用来取切分后的第三列数据。

    [root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' '{print $3}'
    id;//ID
    email;//邮箱
    phonenum;//电话
    password;//密码
    code;//编码
    nickname;//昵称
    sex;//性别
    birthday;//出生日期
    address;//地址
    imgurl;//头像URL
    createtime;//创建时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🙇‍♀2.4 awk指定符号切分,并依据空格输出

      经过上一步的处理,得到了字段和注释,现在字段和注释之间只有符号;//,所以再次使用awk,按照这些字符切分后,分别取到第一和第二个数据输出即可。为方便后续导入到数据库中,在字段和注释之间,以空格划分。

    [root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' '{print $3}' | awk -F ';//' '{print $1"\t"$2}'
    id      ID
    email   邮箱
    phonenum        电话
    password        密码
    code    编码
    nickname        昵称
    sex     性别
    birthday        出生日期
    address 地址
    imgurl  头像URL
    createtime      创建时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🙇‍♀2.5.1 输出处理结果

      将上一步处理的结果,以文件的形式处理,这里采用>>文件数据追加的方式。

    [root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' '{print $3}' | awk -F ';//' '{print $1"\t"$2}' >> JavaETLFile.txt
    [root@zxy_master dao]# cat JavaETLFile.txt
    id      ID
    email   邮箱
    phonenum        电话
    password        密码
    code    编码
    nickname        昵称
    sex     性别
    birthday        出生日期
    address 地址
    imgurl  头像URL
    createtime      创建时间
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    🙇‍♀2.5.2 优化输出处理结果

      从上一步可以看出,输出的结果中只有数据,如果后续将数据导入表中的话,是需要对数据做一下标注的。

      这里为了效果明细,先把上一步生成的文件删除,在awk后添加,BEGIN {print "field""\t""remark"},即可实现在第一行输出指定数据。

    
    [root@zxy_master dao]# rm -r JavaETLFile.txt
    rm: remove regular file ‘JavaETLFile.txt’? y
    [root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' '{print $3}' | awk -F ';//' 'BEGIN {print "field""\t""remark"} {print $1"\t"$2}' >> JavaETLFile.txt
    [root@zxy_master dao]# cat JavaETLFile.txt
    field   remark
    id      ID
    email   邮箱
    phonenum        电话
    password        密码
    code    编码
    nickname        昵称
    sex     性别
    birthday        出生日期
    address 地址
    imgurl  头像URL
    createtime      创建时间
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    👊三、完善处理过程一

    🙇‍♀3.1 脚本介绍

      以上内容,简单介绍了整体的处理流程,但是使用命令行的形式,一个一个的处理实体类还是比较麻烦的,这一步就通过将命令写到脚本中,通过传入实体类名的形式依次处理。

      通过 1 接收脚本传入的参数 , 将传入的参数赋给 F i l e N a m e ,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是 ‘ 1接收脚本传入的参数,将传入的参数赋给FileName,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是` 1接收脚本传入的参数,将传入的参数赋给FileName,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是{FileName}.java,从而获取原始数据。第二个是-v filename=“${FileName}”,使用-v可以动态获取参数,从而将filename的数据使用{print filename"\t"$1"\t"$2}命令。

    [root@zxy_master dao]# vim JavaToTxt.sh
    #!/bin/bash
    # filename: JavaToTxt.sh
    # auth: zxy
    # date: 2022-09-04
    
    # 接收参数
    FileName=$1
    
    cat ./${FileName}.java | grep private | awk -F ' ' '{print $3}' | awk -F ';//' -v filename="${FileName}" 'BEGIN {print "tablename""\t""field""\t""remark"} {print filename"\t"$1"\t"$2}' >> JavaETLFile.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    🙇‍♀3.2 脚本测试

    [root@zxy_master dao]# sh JavaToTxt.sh User
    [root@zxy_master dao]# cat JavaETLFile.txt
    tablename       field   remark
    User    id      ID
    User    email   邮箱
    User    phonenum        电话
    User    password        密码
    User    code    编码
    User    nickname        昵称
    User    sex     性别
    User    birthday        出生日期
    User    address 地址
    User    imgurl  头像URL
    User    createtime      创建时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    👊三、完善处理过程二

      通过如上脚本,即可以在执行脚本的时候传入实体类名称进行处理数据,下面就再次通过脚本,一次性获取所有实体类的执行命令。对这个指令就不做详细的介绍,不太明白的可以参考第二节的介绍

    [root@zxy_master dao]# ls
    Admin.java  Course.java  JavaToTxt.sh  QueryVo.java  Speaker.java  User.java
    
    [root@zxy_master dao]# ll | grep '.java' | awk -F ' ' '{print $9}' | awk -F '.' '{print "sh JavaToTxt.sh "$1}'
    sh JavaToTxt.sh Admin
    sh JavaToTxt.sh Course
    sh JavaToTxt.sh QueryVo
    sh JavaToTxt.sh Speaker
    sh JavaToTxt.sh User
    
    [root@zxy_master dao]# sh JavaToTxt.sh Admin
    [root@zxy_master dao]# sh JavaToTxt.sh Course
    [root@zxy_master dao]# sh JavaToTxt.sh QueryVo
    [root@zxy_master dao]# sh JavaToTxt.sh Speaker
    [root@zxy_master dao]# sh JavaToTxt.sh User
    [root@zxy_master dao]#
    
    [root@zxy_master dao]# cat JavaETLFile.txt
    tablename       field   remark
    Admin   id      ID
    Admin   username        用户名
    Admin   password        密码
    Admin   roles   角色
    tablename       field   remark
    Course  id      ID
    Course  courseTitle     课程标题
    Course  subjectId       主题ID
    Course  courseDesc      课程详情
    Course  videoList;
    tablename       field   remark
    QueryVo title   标题
    QueryVo courseId        课程ID
    QueryVo speakerId       讲师ID
    tablename       field   remark
    Speaker id      ID
    Speaker speakerName     讲师名
    Speaker speakerJob      讲师工作
    Speaker headImgUrl      头像URL
    Speaker speakerDesc     讲师介绍
    tablename       field   remark
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    👊四、完整处理脚本

    #!/bin/bash
    # filename: JavaToTxt.sh
    # auth: zxy
    # date: 2022-09-04
    
    # 接收参数
    FileName=$1
    
    # 帮助函数
    usage() {
            echo "usage:"
            echo "sh JavaToTxt.sh filename"
            echo "获取批量处理文件命令如下:"
            echo "ll | grep '.java' | awk -F ' ' '{print $9}' | awk -F '.' '{print "sh JavaToTxt.sh "$1}'"
            exit 0
    }
    
    cat ./${FileName}.java | grep private | awk -F ' ' '{print $3}' | awk -F ';//' -v filename="${FileName}" 'BEGIN {print "tablename""\t""field""\t""remark"} {print filename"\t"$1"\t"$2}' >> JavaETLFile.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    👊五、数据导入

      将txt文件下载下来,导入到数据库中即可,方法很多,仅供参考。

    DBeaver线下数据导入数据库表

    👊六、数据简单处理

      因为在执行脚本时,每执行一次都会输出一次使用awkBegin的内容,也就是tablename,field,remark,在导入数据后做简单处理。另一种是,当字段没有注释的时候,会存在切分后取到一行空值的,处理即可。

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    LeetCode-19. Remove Nth Node From End of List [C++][Java]
    ArrayList与List的层级关系及ArrayList解析
    RHCE(逻辑卷LVM,NFS服务)
    JAVA毕业设计冠军体育用品购物网站计算机源码+lw文档+系统+调试部署+数据库
    我反对独立开发者做笔记产品:从商业角度看笔记产品市场竞争
    如何理解相位噪声与时间抖动的关系?
    带你了解“JSON解析”
    python基础语法-类与对象(简单实用)
    jQuery基础----常用的选择器
    Java-API简析_java.util.Objects类(基于 Latest JDK)(浅析源码)
  • 原文地址:https://blog.csdn.net/m0_51197424/article/details/126692485