challenge 固定長データ

固定長のデータが記載されたファイルを読み込むプログラムを作成してください。読み込んだデータは、複数の値を格納できるデータ型に格納してください。

ファイルには、すべて ascii 文字で以下のデータが格納されています。デリミタはなく、固定長で格納されています。レコードとレコードのあいだも改行はありません。

  1. 姓 (12文字) 文字数が足りない場合は、後ろを空白で埋めてあります。
  2. 名 (12文字) 文字数が足りない場合は、後ろを空白で埋めてあります。
  3. 性別 (F,M,Uの3種類、1文字)
  4. 年齢 (3桁の数字、桁数が足りない場合は、ゼロで埋めず、頭を空白で埋めてあります。
  5. 年 2008 固定
  6. 月 03 固定
  7. さらに以下のデータが日付分くりかえされます。
    1. 日付 (01 〜 31) 2文字
    2. 朝食のメニュー (500文字)
    3. 昼食のメニュー (500文字)
    4. 夕食のメニュー (500文字)

以上の形式のデータ500人分を読みこんで、データを複数の値を格納できるデータ型に格納してください。データに大して何か処理を行う必要はなく、すぐに破棄してかまいません。

この問題は、このようなファイルをどのように扱うかを知りたくて作成しました。

Posted feedbacks - Python

エラー処理は無しです 特に面白みは無いですね

日付などが、文字列ではなくバイナリであれば structが生きてくるかもしれませんが

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#固定長データ
import struct
f = file("foo.txt" , "rb")

result = []
fmt = "12s 12s 1s 3s 4s 2s" + "2s 500s 500s 500s"*31

size = struct.calcsize(fmt)
while(True):
    r = f.read(size)
    if len(r) < size:
        break
    
    data = struct.unpack(fmt , r)
    
    d = dict(
        FirstName  = data[0] , 
        SecondName = data[1] ,
        Sex = data[2] ,
        Age = int(data[3]) ,
        Year= int(data[4]) ,
        Month=int(data[5])
        Menu = {}
    )
    
    for i in range(31):
        Day = int(data[6+4*i])
        menu = dict(
            BreakFirst = data[7+4*i]
            Lunch = data[8+4*i]
            Dinner  = data[8+4*i]
        )
        d["Menu"][Day]=menu
    
    result.append(d)

サクッと書いてみました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
dat = open('data.txt').read()
day_count = 31
person_count = 500

pat = [12, 12, 1, 3, 4, 2]
for i in range(day_count):
    pat += [2, 500, 500, 500]

start = 0
end = 0
person = []
persons = []

for i, length in enumerate(pat * person_count):
    end += length
    person.append(dat[start:end])
    start += length
    if i % len(pat) == len(pat) - 1:
        persons.append(person)
        person = []

Index

Feed

Other

Link

Pathtraq

loading...