固定長データ
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
|



Mymelo #6060() Rating5/7=0.71
固定長のデータが記載されたファイルを読み込むプログラムを作成してください。読み込んだデータは、複数の値を格納できるデータ型に格納してください。
ファイルには、すべて ascii 文字で以下のデータが格納されています。デリミタはなく、固定長で格納されています。レコードとレコードのあいだも改行はありません。
以上の形式のデータ500人分を読みこんで、データを複数の値を格納できるデータ型に格納してください。データに大して何か処理を行う必要はなく、すぐに破棄してかまいません。
この問題は、このようなファイルをどのように扱うかを知りたくて作成しました。
[ reply ]