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

レコードの構造を表現するのに, Hashクラスでなく順序が定義されているStructureクラスのオブジェクトを使用しました. 必要に応じてflattenなりjoinを使用してから出力すれば, 使用しやすい形になると思います.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
module StaticRecord
  def read_record(max_num)
    rec_struct = Struct.new(:family_name, :last_name, :sex, :age,
                            :year, :month, :days)
    days_struct = Struct.new(:day, :breakfast, :lunch, :supper)
    record = rec_struct.new(12, 12, 1, 3, 4, 3,
                            days_struct.new(2, 500, 500, 500))
    max_num.times{record.map{|x|
        len_ary, range = x.kind_of?(Struct) ? [x, 1..31] : [[x], 1..1]
        range.map{len_ary.map{|n| read(n)}}}}
  end
end
class IO
  include StaticRecord
end
#file = 'D:/home/tmp/test.rec'
File.open(file, "r"){|f| f.read_record(500)}

Index

Feed

Other

Link

Pathtraq

loading...