6
回答
提取某文件夹下多个TXT文件里面的一些内容,然后统一整理写到EXCEL表格内。
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

工程设计软件PKPM输出计算结果是txt文件,每层的内力结果为一个文件,其中包括柱、梁、墙的结果。我想把其中柱的计算内力结果提取出来,整理写入EXCEL文件,以便后续计算。想用python来实现,请高手指点一下。

单个txt文件内容如:

  ----------------------------------------------------------
           |                   第  1 层配筋、验算                   |
           ----------------------------------------------------------


 ==============================================================================
 |                              柱配筋和验算输出                              |
 ==============================================================================
 N-C=   1 ( 14)B*H*U*T*D*F(mm)=  271*  700*  271*  700*    8*    8
 Cx= 1.78 Cy= 1.23 Lc=  4.200(m) Nfc= 1 Rcc= 50.0 Rsc=  345 Fy=  360. Fyv=  360.
 RLIVEC=  0.60  方钢管混凝土柱
 柱顶弯矩调整系数: 1.00   柱底弯矩调整系数: 1.00     柱剪力调整系数: 1.50
     矩形钢管混凝土柱,按规程CECS 159:2004、JGJ 3-2010
 ( 31)Nu=   -3155. Uc=  0.360
 ( 31)Mx=  -787. My=   -17. N=   -3155. R_F1=   0.57
 ( 29)Mx=  -162. My=   306. N=   -2848. R_F2=   0.64
 ( 31)Mx=  -787. My=   -17. N=   -3155. R_F3=   0.72
 ( 28)Sx=  -178. R_F4=   0.19
 ( 31)Sy=   195. R_F5=   0.08
 长细比: Rmdx=   27.51  Rmdy=   45.00
 宽厚比, b/tf=   31.88  b/tf_max=   61.00
 高厚比, h/tw=   85.50  h/tw_max=   61.00
 抗剪承载力: CB_XF=   305.1  CB_YF=   770.3
 
  ** 方钢管管壁板件边长与其厚度比值超限
     D/t=   87.50>   49.52
  ** 混凝土承担系数超限
     ARFc=    0.46 > ARFcmax=    0.40
  ** 高厚比超限
     h/tw=   85.50 > h/tw_max=   61.00
 ----------------------------------------------------------------------------
 N-C=   2 ( 14)B*H*U*T*D*F(mm)=  271*  700*  271*  700*    8*    8
 Cx= 1.78 Cy= 1.23 Lc=  4.200(m) Nfc= 1 Rcc= 50.0 Rsc=  345 Fy=  360. Fyv=  360.
 RLIVEC=  0.60  方钢管混凝土柱
 柱顶弯矩调整系数: 1.00   柱底弯矩调整系数: 1.00     柱剪力调整系数: 1.50
     矩形钢管混凝土柱,按规程CECS 159:2004、JGJ 3-2010
 ( 31)Nu=   -2954. Uc=  0.337
 ( 31)Mx=  -725. My=   -16. N=   -2954. R_F1=   0.53
 ( 29)Mx=   -65. My=   306. N=   -2763. R_F2=   0.59
 ( 31)Mx=  -725. My=   -16. N=   -2954. R_F3=   0.66
 ( 28)Sx=  -178. R_F4=   0.19
 ( 31)Sy=   176. R_F5=   0.07
 长细比: Rmdx=   27.51  Rmdy=   45.00
 宽厚比, b/tf=   31.88  b/tf_max=   61.00
 高厚比, h/tw=   85.50  h/tw_max=   61.00
 抗剪承载力: CB_XF=   306.4  CB_YF=   773.9
 
  ** 方钢管管壁板件边长与其厚度比值超限
     D/t=   87.50>   49.52
  ** 混凝土承担系数超限
     ARFc=    0.46 > ARFcmax=    0.40
  ** 高厚比超限
     h/tw=   85.50 > h/tw_max=   61.00
 ----------------------------------------------------------------------------
 N-C=   3 ( 14)B*H*U*T*D*F(mm)=  271*  700*  271*  700*    8*    8
 Cx= 1.78 Cy= 1.23 Lc=  4.200(m) Nfc= 1 Rcc= 50.0 Rsc=  345 Fy=  360. Fyv=  360.
 RLIVEC=  0.60  方钢管混凝土柱
 柱顶弯矩调整系数: 1.00   柱底弯矩调整系数: 1.00     柱剪力调整系数: 1.50
     矩形钢管混凝土柱,按规程CECS 159:2004、JGJ 3-2010
 ( 31)Nu=   -3035. Uc=  0.346
 ( 31)Mx=  -773. My=    14. N=   -3035. R_F1=   0.55
 ( 29)Mx=  -105. My=   305. N=   -2771. R_F2=   0.61
 ( 31)Mx=  -773. My=    14. N=   -3035. R_F3=   0.69
 ( 28)Sx=  -178. R_F4=   0.19
 ( 31)Sy=   188. R_F5=   0.08
 长细比: Rmdx=   27.51  Rmdy=   45.00
 宽厚比, b/tf=   31.88  b/tf_max=   61.00
 高厚比, h/tw=   85.50  h/tw_max=   61.00
 抗剪承载力: CB_XF=   306.3  CB_YF=   773.4
 
  ** 方钢管管壁板件边长与其厚度比值超限
     D/t=   87.50>   49.52
  ** 混凝土承担系数超限
     ARFc=    0.46 > ARFcmax=    0.40
  ** 高厚比超限
     h/tw=   85.50 > h/tw_max=   61.00
 ----------------------------------------------------------------------------
 N-C=   4 ( 14)B*H*U*T*D*F(mm)=  271*  700*  271*  700*    8*    8
 Cx= 1.40 Cy= 1.24 Lc=  4.200(m) Nfc= 1 Rcc= 50.0 Rsc=  345 Fy=  360. Fyv=  360.
 RLIVEC=  0.60  方钢管混凝土柱
 柱顶弯矩调整系数: 1.70   柱底弯矩调整系数: 1.70     柱剪力调整系数: 2.55
     矩形钢管混凝土柱,按规程CECS 159:2004、JGJ 3-2010
 ( 31)Nu=   -4976. Uc=  0.568
 ( 38)Mx=   886. My=   -16. N=    2350. R_F1=   0.98
 ( 31)Mx=  -884. My=    17. N=   -4976. R_F2=   0.81
 ( 31)Mx=  -884. My=    17. N=   -4976. R_F3=   0.96
 ( 29)Sx=   174. R_F4=   0.19
 ( 30)Sy=  -244. R_F5=   0.10
 长细比: Rmdx=   21.67  Rmdy=   45.37
 宽厚比, b/tf=   31.88  b/tf_max=   61.00
 高厚比, h/tw=   85.50  h/tw_max=   61.00
 抗剪承载力: CB_XF=   292.1  CB_YF=   736.3
 
  ** 方钢管管壁板件边长与其厚度比值超限
     D/t=   87.50>   49.52
  ** 混凝土承担系数超限
     ARFc=    0.46 > ARFcmax=    0.40
  ** 高厚比超限
     h/tw=   85.50 > h/tw_max=   61.00
===================================================================
 |                              墙配筋和验算输出                              |
 ==================================================================
 N-WC=   1 (I=   985 J=   986) B*H*Lwc(m)= 0.27*  0.80*  4.20
 aa=  40(mm) Nfw= 1 Rcw= 50.0 Fy=  360. Fyv=  210. Fyw=  300. Rwv= 0.15
 双侧:Bsp=    8.0(mm) fsp=  310.
 该墙柱在地震组合下有受拉的情况,若该墙柱是双肢墙的其中一肢,请在前处理定义双肢墙,以让程序做相应的内力调整。
 RLIVE=  0.60  钢板混凝土墙 短肢墙 地下室外墙 加强区
      Nu=    -981. Uc=  0.109
 ( 29)M=    270.  V=    142.  Rmdw=   2.506
 (  1)M=     -13. N=   -1121.  As=     0.
 (  1)V=       1. N=   -1121. Ash=  101.2 Rsh=  0.25
  Asv 为在侧向 水土 压力下, 外墙每延米双侧竖向分布筋面积(可配成双排)
  竖向力PN=   -1286. 面外水平压力PL=      21. 最大弯矩Mv=      38. Asv=   1620.0(mm2/M)
 抗剪承载力: WS_XF =     0.0 WS_YF =  1138.6
 
  剪压比(组合号):JYB( 29)=0.048
 ----------------------------------------------------------------------------
 N-WC=   2 (I=   986 J=   989) B*H*Lwc(m)= 0.27*  0.80*  4.20
 aa=  40(mm) Nfw= 1 Rcw= 50.0 Fy=  360. Fyv=  210. Fyw=  300. Rwv= 0.15
 双侧:Bsp=    8.0(mm) fsp=  310.
 该墙柱在地震组合下有受拉的情况,若该墙柱是双肢墙的其中一肢,请在前处理定义双肢墙,以让程序做相应的内力调整。
 RLIVE=  0.60  钢板混凝土墙 短肢墙 地下室外墙 加强区
      Nu=    -969. Uc=  0.108
 ( 28)M=    521.  V=    220.  Rmdw=   3.113
 (  1)M=      12. N=   -1108.  As=     0.
 (  1)V=       0. N=   -1108. Ash=  101.2 Rsh=  0.25
  Asv 为在侧向 水土 压力下, 外墙每延米双侧竖向分布筋面积(可配成双排)
  竖向力PN=   -1270. 面外水平压力PL=      21. 最大弯矩Mv=      38. Asv=   1620.0(mm2/M)
 抗剪承载力: WS_XF =  1138.2 WS_YF =     0.0
 
  剪压比(组合号):JYB( 28)=0.074
 ----------------------------------------------------------------------------
 N-WC=   3 (I=   998 J=  1004) B*H*Lwc(m)= 0.27*  0.80*  4.20
 aa=  40(mm) Nfw= 1 Rcw= 50.0 Fy=  360. Fyv=  210. Fyw=  300. Rwv= 0.15
 双侧:Bsp=    8.0(mm) fsp=  310.
 该墙柱在地震组合下有受拉的情况,若该墙柱是双肢墙的其中一肢,请在前处理定义双肢墙,以让程序做相应的内力调整。
 RLIVE=  0.60  钢板混凝土墙 短肢墙 地下室外墙 加强区
      Nu=   -1486. Uc=  0.166
 ( 29)M=    544.  V=    223.  Rmdw=   3.211
 (  1)M=      -4. N=   -1704.  As=     0.
 (  1)V=       8. N=   -1704. Ash=  101.2 Rsh=  0.25
  Asv 为在侧向 水土 压力下, 外墙每延米双侧竖向分布筋面积(可配成双排)
  竖向力PN=   -1964. 面外水平压力PL=      21. 最大弯矩Mv=      38. Asv=   1620.0(mm2/M)
 抗剪承载力: WS_XF =  1155.9 WS_YF =     0.0
 
  剪压比(组合号):JYB( 29)=0.075
 ----------------------------------------------------------------------------
上面颜色标识的数据就是我想提取的内容,导入excel后如:


谢谢。

举报
zxlrock
发帖于2年前 6回/2K+阅
共有6个答案 最后回答: 2年前

你学正则表达式。用正则处理逻辑会简单很多。开启re.DOTALL参数,让 . 可以匹配换行。

建议结果输出为CSV文件。基本上不需要额外学习。

python第三方模块很多,有学习门槛。

https://openpyxl.readthedocs.org/en/2.3.3/

谢谢楼上。openpyxl挺简单的,没有门槛。


from openpyxl import Workbook
wb = Workbook()

# grab the active worksheet
ws = wb.active

# Data can be assigned directly to cells
ws['A1'] = 42

# Rows can also be appended
ws.append([1, 2, 3])

# Python types will automatically be converted
import datetime
ws['A2'] = datetime.datetime.now()

# Save the file
wb.save("sample.xlsx")



"""
python提取PKPM软件数据写入到EXCEL文件.py
http://www.oschina.net/question/2661202_2154877
2016年3月5日 00:34:38 codegay
原文数据很多没说清楚,省点精力就写个大概。
"""
import re
import openpyxl

with open("a.txt",encoding="utf-8") as f:
    txt=f.read()

#表头    
head=["标准层","N-C","工况","Nu","Uc","N-C","MX","MY","N"]
wb=openpyxl.Workbook()
ws=wb.active
ws.append(head)

rec=re.findall("""N-C=.*?(\d+) .*?Nu=\s*([-+]?\d+)\. Uc=  ([-+]?\d+[\.\d]*).*?抗剪承载力""",txt,re.DOTALL)
print(rec)

for r in range(0,3):
        ws['B'+str(2+r)]=rec[r][0]#N-C
        ws['D'+str(2+r)]=rec[r][1]#Nu
        ws['E'+str(2+r)]=rec[r][2]#Uc
wb.save("test.xlsx")



引用来自“幻视Vision”的评论

你学正则表达式。用正则处理逻辑会简单很多。开启re.DOTALL参数,让 . 可以匹配换行。

建议结果输出为CSV文件。基本上不需要额外学习。

python第三方模块很多,有学习门槛。

谢谢各位热心朋友的指点,有了大概方向了,在朋友们的帮助下,初步有了一个模子,发上来,让各位大神指点指正一下。

#!/usr/bin/env/python3
# _*_ coding: utf-8 _*_
'''
运行环境:
Python 3.4+
需要第三方库 openpyxl
'''


from openpyxl import Workbook
import os, re

def getTxtFiles(path, suffix):
    rslt = []
    for dirpath, dirname, filenames in os.walk(path):
        for filename in filenames:
            if filename.lower().endswith("." + suffix.lower()):
                rslt.append(os.path.join(dirpath, filename))

    return rslt

def fileProc(filename):
    row1st_pattern = re.compile(r'第\s+(\d+)\s+层配筋、验算')
    valid_row_pattern = re.compile(r'[a-zA-Z]+\=\s+(?:\-)?\d+(?:\.\d+)?')
    split_ptr = re.compile(r'\=\s+')
    nc_ptr = re.compile(r'[a-zA-Z]+\-[a-zA-Z]+\=\s+\d+')
    titles = []
    lines = []
    try:
        with open(filename) as ifs:
            line_cont = {}
            cont = ifs.read().decode('gb18030').encode('utf-8')   #gbk
            print('正在开始分析下个标准层')
            for line in cont.strip().split('\n'):  #修改trim为strip
                if line:
                    c0 = row1st_pattern.findall(line)
                    c1 = nc_ptr.findall(line)
                    if c0:
                        line_cont["标准层"] = c0
                        titles.append("标准层")

                    if c1:
                        key_vals = split_ptr.split(c1)
                        line_cont[key_vals] = key_vals
                        titles.append(key_vals)

                    if line.startswith('( '):
                        for ptrs in valid_row_pattern.findall(line):
                            k_vs = split_ptr.split(split_ptr)
                            line_cont[k_vs] = k_vs
                            titles.append(k_vs)

                    if line.startswith('-'*10):
                        lines.append(line_cont)

    except Exception as e:
        print(e, )
    finally:
        return titles, lines

def writeExcel(titles, lines, path):
    wb = Workbook()
    ws1 = wb.active
    ws1.title = "Anything"
    ws1.append(titles)
    for line in lines:
        line_cont = []
        for title in titles:
            line_cont.append(line.get(title))
        ws1.append(line_cont)
        
    wb.save("test.xlsx")        
#    wb.save(filename = path)
#    print("生成文件:%s\n" % path)

def proc(path, suffix):
    for filename in getTxtFiles(path, suffix):
        titles, lines = fileProc(filename)
        filepath = filename[:filename.rfind('.')]
        outfilename = filepath + ".xlsx"
        writeExcel(titles, lines, outfilename)

if __name__ == '__main__':
    # 输入文件目录的完整路径
    # path = '/Users/helio/Downloads'
    path = 'e:/text'
    # 需要的文件后缀名,不区分大小写
    suffix = "OUT"
    proc(path, suffix)



顶部