ScalaでCSVから読み込んだ郵便番号を住所に変換したメモ

年賀状を出す相手が急に増えてしまったので。

概要

  • OpenCSVというJava用のCSVライブラリでCSVのデータを読み込みます。
  • 郵便番号検索APIが住所データに変換してくれます
  • XMLのデータが手に入るので、あとは好きに遊んでください。

ソースコード

コピペしてすぐに遊びたいせっかちさんのために。

import java.io.FileReader
import scala.xml.XML
import au.com.bytecode.opencsv.CSVReader

object Main extends App {
  val reader = new CSVReader(new FileReader("ファイルの場所/foobar.csv"))

  val csv = Stream.continually {
    reader.readNext()
  } takeWhile { null != } tail // 1行目は不要(はがきデザインキットで使っているCSVの場合、列名が入っているので)

  val postals = csv map { _(6) } // 郵便番号が入っているのは6列目(はがきデザインキットで(ry

  for (pos <- postals) {
    val uri = "http://zip.cgis.biz/xml/zip.php" + "?zn=" + pos

    val result = XML.load(uri) \ "ADDRESS_value"
    Thread.sleep(5000)

    val addr = List(result \\ "@state", result \\ "@city", result \\ "@address")
    println(addr.mkString(","))
  }
}

OpenCSVについて

JavaのCSV用ライブラリ OpenCSV - dirablueの日記ここさえ読めばなんとかなります。
String[] <=> Array[String] であることさえ注意していれば、もう何も恐くない。

なんでStreamで読み込んでるの?

僕も最初はListBuffer作ったり、 var line = ""; while({line = reader.readNext; line})以下略 とか書いてました。
そのとき、ふとニコニコ生放送で見たこのスライドを思い出したので。
ドワンゴ社内 scala勉強会 で「クリエイティブで高品質なScalaプログラマになるための10のTips」 という発表をした - ゆろよろ日記
03.whileとStream

XMLの使い方は?

僕もよくわかってません(ぉぃ)。
日本語情報はこのあたりでしょうか。
ScalaでWebスクレイピングしようとしたメモ - Scala覚書

そして、
受け取りデータ説明(XML編) 郵便番号検索API
ここをみながら適当にデータを抽出して、遊びます。