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の理解を深める必要がありそうです。