数据备份工具 BackupSerenity V2.2 新增 CSV,XLSX/XLS 导入工具集

使用场景:在使用数据库时会有批量数据导入的场景,数据源可能人工生成的XLS表格或者是别的系统导出的CSV

V2.2 更新内容:

wip – 🕔 新增:XLSX文件批量导入工具集

wip – 🕔 新增:CSV文件批量导入工具集


CSV 工具集操作文档

Author: GPT4.0 & heike07

将包含表头的CSV文件批量导入至MYSQL

文件结构

|- csv_input_mysql.py 数据批量导入工具|- cleaned_datas.py 数据批量文件清洗工具|- differ_datas.py 数据批量比对工具

数据导入工具

csv_input_mysql.py

运行启动

启动脚本

直接执行:python3 csv_input_mysql.py或通过日志生成nohup python3 csv_input_mysql.py > csv_input_mysql.log &生成的文件名称 csv_input_mysql.log 可以根据情况修改,如果想保留全部日志可以将 > 替换为 >> 即可

查看日志

vim csv_input_mysql.log

调试DEBUG

字符串替换

table_name = os.path.splitext(filename)[0].replace('.', '-')根据实际情况替换CSV文件中分隔符

Field_type

create_table_query += "`" + header.replace('"', '') + "` TEXT, "根据实际情况调整字段类型

ERR

常见错误

数据表格 `XXX` 创建失败: (1059, "Identifier name 'XXX' is too long")表名过长,不能超过64字符,修改CSV文件名称数据表格 `XXX2` 创建失败: (1118, 'Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs')设置为vchar(255)的字段长度不足与承载数据长度,尝试设置成TEXT或增大字段设置长度

字符集错误

  File "csv_input_mysql.py", line 40, in     headers = next(csv_reader)  File "/usr/lib64/python3.6/codecs.py", line 321, in decode    (result, consumed) = self._buffer_decode(data, self.errors, final)UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 0: invalid start byte初始文件中有中文,或者编码非utf8 ,此时需要修改代码中 uft8 替换为自己的编码 比如gbk、gb2312 等

数据源(windows&linux) 用于CSV生成的操作系统不同的换行符是不一样的。

导入过程中出现大类警告'Warning', 1262, 'Row 64 was truncated; it contained more data than there were input columns'修改 csv_input_mysql.py 中的源数据为LINUX导出CSV换行修改为: LINES TERMINATED BY '\\\\n'源数据为WINDOES导出CSV换行修改为: LINES TERMINATED BY '\\\\r\\\\n'

依赖缺失错误

执行带字符编码检测的程序csv_input_data_chardet.py时提示Traceback (most recent call last):  File "csv_input_data_chardet.py", line 5, in     import chardetModuleNotFoundError: No module named 'chardet'解决方法pip3 install chardet

批量数据验证

源数据无法预估质量,会出现源数据换行等情况,此时可以使用批量清洗工具进行清洗,清洗后即可进行验证

如何批量验证?

通过数据导入程序进行导入程序后,对原始csv进行批量文件清洗将原始文件 放入input文件夹{没有创建一下}执行批量清洗程序python3 cleaned_datas.py执行后可以通过输出结果查询结果:[root@ict181 db_cls]# python3 differ_datas_v3.py cleaned_xxl_job.xxl_job_1.csv: MySQL 行数 = 27, 清洗后行数 = 28, 数据校验 = 校验通过cleaned_xxl_job.xxl_job_2.csv: MySQL 行数 = 621, 清洗后行数 = 622, 数据校验 = 校验通cleaned_xxl_job.xxl_job_3.csv: MySQL 行数 = 1, 清洗后行数 = 2, 数据校验 = 校验通过cleaned_xxl_job.xxl_job_4.csv: MySQL 行数 = 0, 清洗后行数 = 1, 数据校验 = 校验通过cleaned_xxl_job.xxl_job_5.csv: MySQL 行数 = 73, 清洗后行数 = 74, 数据校验 = 校验通过cleaned_xxl_job.xxl_job_6.csv: MySQL 行数 = 0, 清洗后行数 = 1, 数据校验 = 校验通过cleaned_xxl_job.xxl_job_log.csv: MySQL 行数 = 74513, 清洗后行数 = 74514, 数据校验 = 校验通过cleaned_xxl_job.xxl_job_info.csv: MySQL 行数 = 92, 清洗后行数 = 93, 数据校验 = 校验通过所有文件的行数对比和数据校验工作已完成。通过nohup进行后台执行参考前面执行方式通过 | grep 进行日志筛选

XLSX 工具集操作文档

Author: GPT4.0 & heike07

将包含表头的XLS和XLSX文件批量导入至MYSQL

文件结构

|- xls_input_mysql.py xls数据批量导入工具|- xls_differ_mysql.py xls数据批量校验工具

启动运行

# python3 xls_input_mysql.pyusage: xls_input_mysql_v8.py [-h] [--batch_size BATCH_SIZE]                             [--field_type FIELD_TYPE]                             directoryxls_input_mysql.py: error: the following arguments are required: directory默认参数为 必写 文件路径 -h 帮助 --batch_size 批量插入行数 默认值{500} --field_type 字段类型 默认值 {vchar(500)}根据自身需求进行运行

执行示例

# python3 xls_input_mysql.py ./xls_db/ --field_type "TEXT"START | 2024-07-26 16:11:25正在处理文件: ./xls_db/改-youfile.xlsx检测到文件编码: utf-8根据编码 `utf-8` 确定字符集: utf8mb4数据表格 `改-youfile` 创建成功数据插入成功,批次 1END | 2024-07-26 16:11:26总执行时间: 00:00:00

数据校验

通过数据校验程序进行数据校验检查数据条数是否一致# python3 xls_differ_mysql.py xls_db/文件: youfile.xlsx | Sheet 页: sheet1 | XLS 数据条数: 327 | MySQL 表: youfile | MySQL 数据条数: 0sheet1 - 数据条数不一致。文件: 反youfile.xlsx | Sheet 页: sheet1 | XLS 数据条数: 327 | MySQL 表: 反_youfile | MySQL 数据条数: 0sheet1 - 数据条数不一致。文件: 改-youfile.xlsx | Sheet 页: sheet1 | XLS 数据条数: 327 | MySQL 表: 改-youfile | MySQL 数据条数: 327sheet1 - 数据条数一致。

ERR

依赖错误

正在处理文件: ./xls_db/youfile.xlsx检测到文件编码: utf-8根据编码 `utf-8` 确定字符集: utf8mb4读取 Excel 文件失败: Missing optional dependency 'openpyxl'.  Use pip or conda to install openpyxl.根据自身环境 选择安装pip install pandas pymysql chardet xlrd

字段内容过长

数据插入失败: (1406, "Data too long for column '修补建议' at row 17")使用TEXT参数进行插入python3 xls_input_mysql.py ./xls_db/ --field_type "TEXT"

数据库链接信息不正确

# python3 xls_differ_mysql.py xls_db/Traceback (most recent call last):  File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 614, in connect    (self.host, self.port), self.connect_timeout, **kwargs  File "/usr/lib64/python3.6/socket.py", line 724, in create_connection    raise err  File "/usr/lib64/python3.6/socket.py", line 713, in create_connection    sock.connect(sa)ConnectionRefusedError: [Errno 111] Connection refusedDuring handling of the above exception, another exception occurred:Traceback (most recent call last):  File "xls_differ_mysql.py", line 74, in <module>    main()  File "xls_differ_mysql.py", line 63, in main    table_name  File "xls_differ_mysql.py", line 24, in get_row_count_from_mysql    database=database  File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 353, in __init__    self.connect()  File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 664, in connect    raise excpymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '192.168.1.15' ([Errno 111] Connection refused)")解决方法检查数据库联系信息并修改xls_differ_mysql.py中的db_config函数参数 ↓    # 数据库连接信息    db_config = {        'user': 'you is user',        'password': 'you is password',        'host': 'you is IP',        'port': 3306,        'database': 'you is database name',    }
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表一休教程网的观点和立场。