TSVファイルを処理する
September 5, 2010 - Scala
Scalaプログラミング入門をざっと読んでから少し間が空いてしまいました。
第1回Scala座を見たりして刺激もらったのでちょっとScala弄りなど。
※Scala座については非公式にトゥギャらせてもらっています。:第1回Scala座非公式勝手まとめ
ちょっと雰囲気を振り返るため、普段PHPでよくやるTSVファイルの読み込みでテスト。
foo.tsvの中身はこんな感じ。
u01,Tokyo u02,Osaka u03,Nagoya u04,Tokyo u05,Fukuoka u06,Nagoya u07,Nagoya u08,Shiga u09,Hokkaido u10,Osaka
これの転置インデックスを作成したい。
で、こちらのブログ記事とかを参考にしたりして、何回か試行錯誤してできたのがこちらのソース。
import scala.collection.mutable.HashMap
import scala.io.Source
import scala.io.BufferedSource
object ReadTsv
{
def main( args: Array[String] )
{
val source = Source.fromFile( "foo.txt" )
try {
var m = new HashMap[String,List[String]]
for( line <- source.getLines ) {
val x:Array[String] = line.stripLineEnd.split(",")
m.update(x(1) , m.get(x(1)) match {
case Some(s) => x(0) :: s
case None => List( x(0) )
})
}
println( m )
} finally {
source.asInstanceOf[BufferedSource].close
}
}
}
実行
```bash $ scalac ReadTsv.scala $ scala ReadTsv Map(Shiga -> List(u08), Nagoya -> List(u07, u06, u03), Tokyo -> List(u04, u01), Osaka -> List(u10, u02), Fukuoka -> List(u05), Hokkaido -> List(u09)) ```手続き型な感じが色濃い気がするけど、もっと関数型的になるのでしょうか。。
とりあえずコレクションとパターンマッチの練習にはなりました。
他人のプログラムを拝見するなどして、もっとScalaの理解を深める必要がありそうです。