如果有任何数据,则在行中的特定列提取数据

时间:2017-08-08 13:37:10

标签: python parsing

我有一个包含下面数据的文件,我需要在74-79和122-124处取出字符,有些行在74-79不会有任何字符,我想跳过这些行。

import re
    def main():
        file=open("CCDATA.TXT","r")
        lines =file.readlines()
        file.close()

        for line in lines:
            lines=re.sub(r" +", " ", line)
            print(lines)


    main()
CF214L214L1671310491084111159          Customer Name                     46081                 171638440 0000320800000000HCCCIUAW    0612170609170609170300000000003135                                                              
CF214L214L1671310491107111509          Customer Name                     46144                 171639547 0000421200000000DRNRIUAW    0612170613170613170300000000003135                                                              
CF214L214L1671380999999900002000007420                                                                                                                                                                                           
CF214L214L1671310491084111159          Customer Name                     46081                 171638440 0000320800000000DRCSIU      0612170609170609170300000000003135                                                              
CF214L214L1671380999999900001000003208                                                                                                                                                                                           
CF214L214L1671510446646410055          Customer Name                     46436                 171677320 0000027200000272AA          0616170623170623170300000050003001                                                              
CF214L214L1671510126566110169          Customer Name                     46450                 171677321 0000117900001179AA          0616170623170623170300000250003001                                                              
CF214L214L1671510063942910172          Customer Name                     46413                 171677322 0000159300001593AA          0616170623170623170300000150003001                                                              
CF214L214L1671510808861010253          Customer Name                     46448                 171677323 0000298600002986AA          0616170623170623170300000350003001                                                              
CF214L214L1671510077309510502          Customer Name                     46434                 171677324 0000294300002943AA          0616170622170622170300000150003001                                                              
CF214L214L1671580999999900029000077728                                                                                                                                                                                           
CF214L214L1671610049631611165          Customer Name                     46221                 171677648 0000178700000000            0616170619170619170300000000003000                                                              
CF214L214L1671610895609911978          Customer Name                     46433                 171677348 0000011800000118AC          0616170622170622170300000150003041                                                              
CF214L214L1671680999999900002000001905 

2 个答案:

答案 0 :(得分:0)

def read_all_lines(filename='CCDATA.TXT'):
    with open(filename,"r") as file:
        for line in file:
            try:
                first = line[74:79]
                second = line[122:124]
            except IndexError:
                continue  # skip line
            else:
                do_something_with(first, second)
编辑:感谢评论,显然应该是:

for line in file:
     first = line[74:79]
     second = line[122:124] 
     if set(first) != set(' ') and set(second) != set(' '):
          do_something_with(first, second)

答案 1 :(得分:0)

简短回答:

只需line[74:79]as Roelant suggested。由于输入中的行总是长230个字符,因此永远不会是IndexError,因此您需要检查结果是否都是isspace()的空白:

field=line[74:79]
<...>
if isspace(field): continue

一种更强大的方法,也可以验证输入(检查您是否需要这样做)是解析整行并使用结​​果中的特定元素。

根据Parse a text file and extract a specific columnTips for reading in a complex file - Python以及get the path in a file inside {} by python的示例,一种方式是正则表达式。

但是对于您的特定格式,似乎是古老的,穿孔卡导出的格式,列号定义了基准的含义,格式可能更方便地表示为与字段名称关联的列号序列(你从来没有告诉我们他们的意思,所以我使用通用名称):

fields=[
    ("id1",(0,39)),
    ("cname_text":(40,73)),
    ("num2":(74:79)),
    ("num3":(96,105)),
    #whether to introduce a separate field at [122:125]
    # or parse "id4" further after getting it is up to you.
    # I'd suggest you follow the official format spec.
    ("id4":(106,130)),
    ("num5":(134,168))
]
line_end=230

并解析如下:

def parse_line(line,fields,end):
    result={}
    #for whitespace validation
    # prev_ecol=0
    for fname,(scol,ecol) in format.iteritems():
        #optionally validate delimiting whitespace
        # assert prev_ecol==scol or isspace(line[prev_ecol,scol])
        #lines in the input are always `end' symbols wide, so IndexError will never happen for a valid input
        field=line[scol:ecol]
        #optionally do conversion and such, this is completely up to you
        field=field.rstrip(' ')
        if not field: field=None
        result[fname]=field
        #for whitespace validation
        # prev_ecol=ecol
    #optionally validate line end
    # assert ecol==end or isspace(line[ecol:end])

所有离开的是跳过的字段为空的行:

for line in lines:
    data = parse_line(line,fields,line_end)
    if any(data[fname] is None for fname in ('num2','id4')): continue

    #handle the data