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 - PostScript

PostScript で。データ用に名前付きファイルを使用しているので Level2 以降限定です。

レコード単位で読み出し、部分文字列に切り出して配列に格納しています。
切り出した部分文字列はコピーではなく参照なので、文字列データに関しては値を書き
換えるとレコード文字列に反映されます。
% 数値データに関しては反映されません。手抜き。

[[(01breakfast           lunch               dinner              ) 1 (breakfast           ) (dinner              ) (lunch               )] ... [(31 ...] ]
[(LASTNAME    Firstname   U 99200803) (LASTNAME    ) (Firstname   ) (U) 99 2008 3]

テストコードはデータを読み込み、10日の朝食のデータを書き換えて書き出しています。
 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
%!PS

/MenuLength 500 def
% /MenuLength 20 def

/ReadHeader {
    % -file- ReadHeader
    %   [(RecordString) (FamilyName) (Name) (Sex) Age Year Month] -file-
    [
        1 index
        12 12 add 1 add 3 add 4 add 2 add string readstring pop
        dup
        dup 0 12 getinterval exch
        dup 12 12 getinterval exch
        dup 24 1 getinterval exch
        dup 25 3 getinterval cvi exch
        dup 28 4 getinterval cvi exch
        32 2 getinterval cvi
    ]
    exch
} bind def

/ReadRecord {
    % -file- nRecords  ReadRecord   [[Records]] -file-
    % [record] : [(RecordString) day (breakfast) (lanch) (dinner)]
    [ exch 2 index exch
    % -file [ -file- nRecords
    {
        % [ -file-
        [ 1 index
        % [ -file- [ -file-
        2 MenuLength 3 mul add string
        readstring pop
        % [ -file- [ (record)
        dup
        dup 0 2 getinterval cvi exch
        dup 2 MenuLength getinterval exch
        dup 2 MenuLength add  MenuLength getinterval exch
        2 MenuLength dup add add MenuLength getinterval
        ] exch
    } repeat
    pop
    ]
    exch
} bind def

 -------- Test Code ----------
(6093.txt) (r) file
ReadHeader
31 ReadRecord
closefile

% Rewrite day 10 breakfast
dup 9 get 2 get % Pickup Data
0 (hogehoge fugafuga) putinterval

(===) = ppstack (===) =

% Write Data
% [Header] [[Records]] 

(6093a.txt) (w) file
% [Header] [[Records]] -file-
dup 4 -1 roll 0 get writestring
% [[Records]] -file-
exch {
    0 get 1 index exch
    writestring
} forall
closefile

Index

Feed

Other

Link

Pathtraq

loading...