moyz666 发表于 2022-1-25 20:07

文本数据转格式为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()

moyz666 发表于 2022-1-26 13:18

ouzhzh 发表于 2022-1-26 09:40
想下载才发现,只有代码没有成品。

木有写界面,也木有做配置文件,比如分隔符 关键词啥的都得改代码,所以打包意义不大,你要是有固定需求我可以帮你打包下:handshake

moyz666 发表于 2022-1-26 13:08

1e3e 发表于 2022-1-25 23:14
可惜只能windows下运行,linux下运行不了,可惜了

Linux安装MSofiice了吗,我木有试过别的系统

Louis_cllc 发表于 2022-1-25 22:46

学习学习,谢谢分享。

1e3e 发表于 2022-1-25 23:14

可惜只能windows下运行,linux下运行不了,可惜了

zljiscx 发表于 2022-1-25 23:16

学习了,谢谢分享

tl;dr 发表于 2022-1-26 07:12

tlf 发表于 2022-1-26 08:35

qishing 发表于 2022-1-26 08:38

谢谢楼主分享

王月半 发表于 2022-1-26 08:49

可以学习下

DrCatcher 发表于 2022-1-26 09:08

1e3e 发表于 2022-1-25 23:14
可惜只能windows下运行,linux下运行不了,可惜了

大哥,python不就是跨平台的吗

hhxx23 发表于 2022-1-26 09:21

这个比较方便,可以试试看
页: [1] 2
查看完整版本: 文本数据转格式为Excel