0

我需要帮助来解析一个如下所示的文本文件:

 WKU  03487472
 WKU 3487472
      Filed Apr. 30, 1968, Ser.  No. 725,329  
      Int.  Cl.  A42b 1122  
 AISD 19700106
 WKU  D2487471
 AISD 19700308
 WKU  03487471
      Filed J   16, 1969  
      [51] Int.  Cl.  A41d 25104  
 AISD 19700106

我想得到一些 csv 格式的输出:

  WKU           Filed               Int.          AISD
 03487472    Apr. 30, 1968      A42b 1122      19700106
 D2487471          .                 .         19700308
 03487471      J   16, 1969      A41d 25104    19700106

我不是程序员并开始使用python。我尝试了如下脚本:

        import csv
        import itertools

        def is_end_of_record(line):
           return line.startswith('WKU')

        class FieldClassifier(object):
           def __init__(self):
               self.field=''
           def __call__(self,row):
              if not row[0].isspace():
                  self.field=row.split(' ',1)[0]
              return self.field

        fields = 'WKU Filed Int. AISD'.split()
        with open('C:\Users\Na\Desktop\example.txt', 'r') as infile:
          with open('example.csv', 'wb') as oufile:
            writer = csv.DictWriter(oufile, fiels=fields) 
            writer.writerow(dict((h, h) for h in fields))
            for end_of_record, lines in itertools.groupby(infile,is_end_of_record):
               if not end_of_record:
                   classifier=FieldClassifier()
                   record={}
                   for fieldname, row in itertools.groupby(lines,classifier):
                        record[fieldname]='; '.join(r.strip() for r in row)

它似乎无法正常工作。如果有人愿意提供帮助或提供任何建议,我将不胜感激。

谢谢,

4

1 回答 1

1

输入文件的格式不是很严格。对于这样的格式,我认为re模块非常有用。我为每条记录创建了正则表达式,第一个元素是一个键,第二个是一个值。我也辞职了itertools

import csv
import re

re_AISD = re.compile(r'(AISD)\s+(\S+)')
re_WKU = re.compile(r'(WKU)\s+(\S+)')
re_Filed = re.compile(r'(Filed)\s+(.*?\d{4})')
re_Int = re.compile(r'(Int.)  Cl.\s+(\w+ \d+)')

FLD_REGEXPES = (re_AISD, re_WKU, re_Filed, re_Int)

def get_field(line):
    for ree in FLD_REGEXPES:
        rx = ree.search(line)
        if rx:
            return (rx.group(1), rx.group(2))
    return (None, None)

def convert_file(fname):
    fields = 'WKU Filed Int. AISD'.split()
    f = open(fname, 'r')
    lines = f.readlines()
    f.close()
    with open(fname + '.csv', 'wb') as oufile:
        writer = csv.DictWriter(oufile, fieldnames=fields, restval = '?', dialect='excel-tab')
        writer.writerow(dict((h, h) for h in fields))
        rec = {}
        for line in lines:
            k, v = get_field(line)
            if k:
                print('[%s]=[%s]' % (k, v))
                if k == 'WKU': # start of new record
                    if rec:
                        writer.writerow(rec)
                    rec = {}
                rec[k] = v
        if rec:
            writer.writerow(rec)

另请注意C:/Users/Na/Desktop/example.txt- 在 Python\中,字符串中的字符是用于换行符的“转义”字符:\n、制表符:\t等。在完整路径文件名中,您可以使用\\或更好地使用/在 Windows 和 Unix 环境中都可以使用的文件名。您还可以使用以 为前缀的“原始”字符串,我在其他正则表达式定义r中使用了此类原始字符串。re_AISD

于 2013-02-28T09:00:23.563 回答