BufferedReaderのIterableなラッパーを書いてみた

XMLやらJSONやら構造化テキスト万歳の時代だけど、レガシーなシステムとの連携や何より作成のしやすさでCSVを扱う機会はまだまだ多いですよね。

で、自分が扱うCSVは大抵「Header」「Body」「Footer」に分かれます。このFooterが曲者。

Listにしてしまえば、簡単に判別出来ますが、100万行とか読む感じだとメモリ気にしてBuffredReaderを下記みたいに使うかと思います。

BufferedReader br = new BufferedReader(getFileReader()));
for(String line = br.readLine(); line != null; line = br.readLine()){...}

ただ、この方法だとHeaderはfor文より先にreadLineすることで簡単にとれますが、Footerはちょっと面倒です。
しかも、いまどき拡張for文じゃないので、ちょっと微妙。というわけで、IterableかつHeaderやFooterが簡単に扱えるのを書いてみました。
https://gist.github.com/2330766

isFirstとisLastが取れるので下記のようなコードで拡張for文の中でheader, body, footerを扱えます.

ReaderIterator records = new ReaderIterator(getReader());
for (String record : records) {
	if (records.isFirst()) {
		assertEquals("header", record);
	} else if (records.isLast()) {
		assertEquals("footer", record);
	} else {
		assertEquals(expecteds.next(), record);
	}
}

@ABC_DX2011曰く「業務でCSVのフッターを見たことが無い」とのことなので、自分以外に需要はあんまりないかも。そもそもあればCommonsなりにありそうだし。

まあ、Java使うならStAXXMLをストリーミング操作しろってことですよね。分かります。DOM使わなければメモリ的にも問題無いし、構造化されてるしモダンですもんね。
というわけで、自分専用が濃厚ですが、せっかく作ったので記事にしてみました。

Happy Hacking!