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そのようなフォーマットの場合、モジュールは非常に便利だと思います。グループ化して各レコードのregexpesを作成しました。最初の要素はキーで、2番目の要素は値です。私も辞任しました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 に答える