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

COBOLで書くべきお題がついにきましたね(笑

読み込み処理はfromStringです。テストデータ作成用にtoStringを作成しています。

matchというのが予約語なので、「match」というメソッドが素直に呼び出せないという・・・

 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
import java.io._
import java.util.Scanner
import java.util.regex._
import scala.io._

object Meal {
  def fromString(text:String) = {
    val scanner = new Scanner(text)
    scanner.findInLine("^(.{12})(.{12})(.{1})(.{3})(.{4})(.{2})
                         (.{2})(.{500})(.{500})(.{500})$")
    val data = classOf[Scanner].getMethod("match",null).
               invoke(scanner,null).  asInstanceOf[MatchResult].group _:int=>String
    new Meal( data(1).trim, data(2).trim, data(3)(0), data(4).trim.toInt,
              data(5).trim.toInt, data(6).trim.toInt, data(7).trim.toInt, 
              data(8), data(9), data(10))
  }
}

class Meal 
  (var lastName:String, var firstName:String, var sex:char, 
   var age:int, var year:int, var month:int, var day:int,
   var breakfast:String, var lunch:String, var dinner:String) {

  def format(template:String, arg:Any*) = {
    String.format(template, arg.map(_.asInstanceOf[AnyRef]).toArray)
  }

  override def toString = {
    format("%-12s%-12s%c%3d%04d%02d%02d%-500s%-500s%-500s\n",
           lastName, firstName, sex, age, year, month, day,
           breakfast, lunch, dinner)
  }

}

Source.fromFile("test.txt").getLines.take(500) foreach Meal.fromString

Index

Feed

Other

Link

Pathtraq

loading...