文本数据转格式为Excel
本帖最后由 moyz666 于 2022-1-26 13:17 编辑原因:对象做报表统计工作,需要把每个人发来的信息统计成Excel报给领导,数据格式比较固定,所以做了个自动化处理的工具
功能:将文本文档里的数据按照分隔符写到Excel中
局限:仅限于26个字段内数据[未做26进制转换]
示例数据:
学号:2022001
姓名:肖红
性别:女
准考证号20046666
数学88
英语73
政治68
计算机综合142
学号:2022002
姓名:肖绿
性别:女
准考证号:20045555
数学:78
英语:63
政治:0[作弊]
计算机综合-132
学号-2022003
姓名-肖黄
性别:男
准考证号-20043333
数学-缺考
英语*53
政治*48
计算机综合*122
学号*2022004
姓名*肖黑
性别:男
准考证号:20042222
数学=58
英语=43
政治=38
计算机综合=112
学号=2022005
姓名:肖青
性别:男
准考证号:20041111
数学:87
英语72
政治:67
计算机综合:142
学号:2022006
姓名:肖橙
性别:男
准考证号20046666
数学86
英语71
政治66
计算机综合141
学号2022007
姓名:肖蓝
性别:女
准考证号:20049999
数学:85
英语:缺考
政治:65
计算机综合:146
学号:2022008
姓名:肖紫
性别:女
准考证号:20048887
数学:89
英语:79
政治:69
计算机综合:149
示例结果:【见最后】
image.png
Python源码:
import re
import xlwings as xw
import os
#需要替换的关键字/词
#原始的关键词
#替换后的关键词切勿与已存在的关键词一致,否则导致数据错误
#前后顺序请务必对齐
Front_key = ['数学']
#替换后的关键词
After_key = ['微积分']
#待读取数据分隔符
#应该为列表
Separator = [':',':','=','*','-']
#每条记录必有关键词以及位于该记录第一行,可重复
Primary_key = '学号'
#数据更正
#print("读取【data.txt】数据中...")
file = open("data.txt","r",encoding='utf-8')
file_index = 0
data_list = []
while True:
#获取每行数据
line = file.readline()
if line:
#替换关键词
key_index = 0
for x in Front_key:
if line.find(x) >= 0:
line = line.replace(Front_key, After_key)
key_index += 1
#将修改后的结果存入
data_list.append(line.replace('\n',''))
file_index += 1
else:
break
#记录上一条信息
pre_line = line
file.close()
#print(data_list)
#统计字段列表, 统计【记录】条数, 精简数据
Record_count = 0
line = ''
data_list_index = 0
TableHeader = []#表头列表
for line in data_list:
flag = 0 #用于标记是否存在分隔符
line = line.replace("\n",'').replace(" ",'')
#统计表头
for sep in Separator:
if line.find(sep) >= 0:
flag = 1
if str(line.split(sep, 1)) not in TableHeader:
dict_key = line.split(sep, 1)
TableHeader.append(dict_key)
break
else:
break
if flag == 0:#若没有分隔符则添加分隔符【只针对值为数字型】
#直接提数
value = re.findall("\d+",line.replace("\n",'').replace(" ",''))
#分离tag
key = line.replace(str(value),'') if value else line
data_list = key + Separator + str(value) if value else ''
#print("补充分隔符:",data_list)
if str(key) not in TableHeader:
TableHeader.append(key)
#拼合数据并写回
#统计记录数
for sep in Separator:
if line.find(sep) >= 0 and str(line.split(sep, 1)) == Primary_key:
Record_count += 1
data_list_index += 1
#print("TableHeader:",TableHeader)
#print("Record_count:",Record_count)
#数据字典初始化
data_dict_index = 0
Data_dict = {}
while data_dict_index <= Record_count:
Data_dict = {}
for key in TableHeader:
Data_dict = ''
data_dict_index += 1
#数据字典填充
data_dict_index = -1
for line in data_list:
if line.find(Primary_key) >= 0:
data_dict_index += 1
for sep in Separator:
if line.find(sep) >= 0:
key = str(line.split(sep, 1))
value = str(line.split(sep, 1))
Data_dict = value
#print("Data_dict:",Data_dict)
#数据最终形态 二维列表
FinalList = [ * (0) for _ in range(Record_count + 1) ]
for R in Data_dict:
for H in TableHeader:
if Data_dict and not Data_dict:
Data_dict = '0'
FinalList.append(Data_dict)
#print("FinalList:",FinalList)
#写入表头
app = xw.App()
wb = app.books.add()
#向表格写入表头
i = 0;
for headerName in TableHeader:
wb.sheets["sheet1"].range(chr(65 + i) + '1').value = headerName
i += 1
#向表格写入数据
FinalList_R_index = 2
for R in FinalList:
FinalList_H_index = 0
for H in R:
wb.sheets["sheet1"].range(chr(65 + FinalList_H_index) + str(FinalList_R_index)).value = H
FinalList_H_index += 1
FinalList_R_index += 1
#自动调整单元格大小
wb.sheets["sheet1"].autofit() ouzhzh 发表于 2022-1-26 09:40
想下载才发现,只有代码没有成品。
木有写界面,也木有做配置文件,比如分隔符 关键词啥的都得改代码,所以打包意义不大,你要是有固定需求我可以帮你打包下:handshake 1e3e 发表于 2022-1-25 23:14
可惜只能windows下运行,linux下运行不了,可惜了
Linux安装MSofiice了吗,我木有试过别的系统 学习学习,谢谢分享。 可惜只能windows下运行,linux下运行不了,可惜了 学习了,谢谢分享 谢谢楼主分享 可以学习下 1e3e 发表于 2022-1-25 23:14
可惜只能windows下运行,linux下运行不了,可惜了
大哥,python不就是跨平台的吗 这个比较方便,可以试试看
页:
[1]
2