本文送给有缘人

文章目录

0. 背景

工具是人类文明进步的阶梯,开源是一种精神,本文的代码献给有缘人。感谢参与改进的所有人,我将不征求你们的同意,将这玩意儿公开。

1. 代码

# -*- coding: utf-8 -*-
# TransMarkov.py
# @author: gw
# @contact: gw.hit.edu.cn
# @time: 20XX/X/XX 14:50

import openpyxl as opx

# 针对SY的马尔科夫矩阵,转换为GW可以接受的格式
'''转换代码使用指北
   工具基础------->Pycharm,Python3.10
   源代码一定要解密!源代码一定要解密!源代码一定要解密!
   基础顶标高在载荷文件中写成了0.0,需要抬高0.4m进行处理后才可以进行载荷文件转化
   SY载荷文件里面包含了多个sheet,其中Markov矩阵中的Mx My Mz/Fx Fy Fz分量与各工况下载荷分量是各占一个sheet,首先应对该Excel文件进行处理:
   Step01 将载荷文件由.xls另存为.xlsx
   Step02 将载荷文件拆分为两个文件,1个单独存放Markov矩阵,按照Mx My Mz Fx Fy Fz排列工作簿,并依次重新命名为0~5
          另一个.xlsx文件存放极限载荷
   Step03 将0~2sheet 中的130*i+2行(i=1,2,3,...sec_num)中的Cycle mean [kNm]替换为kNm,将3~5sheet 中的130*i+2行(i=1,2,3,...sec_num)中的Cycle mean [kN]替换为KN
   Step04 104~107行的文件路径、文件名称、目标文件路径及总截面数量根据实际情况修改,注意应创建空的文件夹用于存档马尔科夫截面矩阵
   Step05 运行程序,删除Markov_T_000k000.xlsx 文件,将所有数据压缩成*.zip格式
'''

def get_filename4save(info):
    '''
    用于SY马尔科夫列表中拿取的高度信息转化为GW马尔科夫矩阵文件名称所采用的格式
    :param info: SY马尔科夫文件中给出包含该截面标高的信息
    :param tail_num: 包含标高信息收尾数字(个、十、百)前的字符长度,info中字符长度不一样,
        主要是弯矩和力的单位KNm和KN字符长度不同引起的,
        如:   'Rainflow cycle distribution [Tower Mx, Tower station height= 0m]'  则info[50:]
    :return: 马尔科夫文件名称,GW马尔科夫文件名称所采用的格式 ,如:Markov_T_022k240.xlsx
    '''
    # if component == 'Mx' or component == 'My' or component =='Mz':
    '''if tail_num == 40:
        height = float(info[tail_num:][:-2])
        #print(height)
        #height = float(info[tail_num:][:-3])
        format_height = '{:0>7}'.format("{:.3f}".format(height))         #.nf 是精度控制,保留小数位数;{:0>7} 表示数字补0,(填充左边,宽度为7),需要根据title中的前序数据不断调整info[xx:]中xx的数据,比如28/50
        filename4save = "Markov_T_" + str(format_height)[:3] + "k" + str(format_height)[-3:] + ".xlsx"

        return filename4save
    #else:
        print("尾部字符数目输入有误!")
        raise ValueError '''
    # print(info, info[61:-3])
    height = float(info[61:-3])
    #print(height)
        #height = float(info[tail_num:][:-3])
    format_height = '{:0>7}'.format("{:.3f}".format(height))         #.nf 是精度控制,保留小数位数;{:0>7} 表示数字补0,(填充左边,宽度为7),需要根据title中的前序数据不断调整info[xx:]中xx的数据,比如28/50
    filename4save = "Markov_T_" + str(format_height)[:3] + "k" + str(format_height)[-3:] + ".xlsx"
    return filename4save


def write_new_format(path, old_filename, path_save, sec_num):
    wb = opx.load_workbook(path + "\\" + old_filename)  # 打开SY的马尔科夫文件
    # ws = wb.get_sheet_by_name(old_file_sheetname)  # 打开工作表  这个位置得看看哪些能些的对,哪些写的不对

    for i in range(sec_num):  # 按照截面依次循环
        wb_new4save = opx.Workbook()  # 创建新的Excel,存放GW格式的马尔科夫
        file_name_buffer = set()  # 创建集合,用于检测6个矩阵是否为统一标高截面的数据
        sheetnames = wb.sheetnames
        for j in sheetnames:  # 按照分量循环
            ws = wb.get_sheet_by_name(j)  # 打开工作表  这个位置得看看哪些能些的对,哪些写的不对
            info = ws.cell(i * 130 + 1, 1).value  # 从马尔科夫文件中提取含标高和分量信息的单元格
            c_n = info[14:16]  # compnent_name, 提取分量信息
            #tail_num = 40 if int(j) > 5 else 41
            filename_i = get_filename4save(info)
            file_name_buffer.add(filename_i)  # 将文件名称放入创建好的集合中,若不是一个截面,那么集合元素将不唯一

            ws_new = wb_new4save.create_sheet(c_n)  # 创建分量对应的工作表
            for u in range(129):
                for v in range(129):
                    ws_new.cell(u + 11, v + 3).value = ws.cell(i * 130 + u + 1, v + 1).value  # 逐行逐列复制数据
            ws_new.cell(4, 3).value = 'Range'
            ws_new.cell(5, 3).value = 'Circles'
            for iii in range(128):
                ws_new.cell(4, iii + 4).value = ws.cell(i * 130 + 2, iii + 2).value
                Circles = 0
                for jjj in range(128):
                    Circles += float(ws.cell(jjj + 2, iii + 2).value)
                    ws_new.cell(5, iii + 4).value = Circles

            unit = 'KNm' if int(j) < 3 else 'KN'
            ws_new.cell(2, 1).value = 'Component ' + c_n
            ws_new.cell(3, 1).value = 'Equivalent Load: ' + c_n + '=' + 'xxx' + unit + '(m=4)'

        if len(file_name_buffer) == 1:
            filename4save = list(file_name_buffer)[0]
            wb_new4save.remove_sheet(wb_new4save.get_sheet_by_name("Sheet"))
            wb_new4save.save(path_save + "\\" + filename4save)


def main():
    path = r"C:\Users\Lenovo\Desktop\测试"  # SY马尔科夫文件所在路径
    old_filename = "HybridTowerLoadResults_Markov.xlsx"  # SY马尔科夫文件名称,*.xlsx格式,带后缀
    path_save = r"C:\Users\Lenovo\Desktop\测试\HybridTowerLoadResults_Markov"   #保存文件路径
    # 存放转换为GW格式以后的马尔科夫文件的路径
    sec_num = 58  # SY文件中包含的截面数量
    write_new_format(path, old_filename, path_save, sec_num)


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

George1415926

看着有用,请作者喝杯咖啡啦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值