opencsvの検証をしてみた

公開日: : 最終更新日:2014/01/26 opencsv ,

お客さんから CSV の解析でバグがあると指摘があり、そのバグ解消のために opencsv を検証してみました。
「こういうケースでもちゃんと解析してくれるのか」ってのをピンポイントで確認しただけなので、検証ってのはちょっと大げさかもしれないですが、使い方のサンプルにはなると思いますので参考にしてみてください。

CSSS85_zangyoumonita20131019500

目次

1. 動作環境

動作環境は次の通りです。

Java

まずは Java のバージョンから。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

Maven

続いて Maven
この検証のためのプロジェクトを Maven で作成しただけです。
Maven と検証内容は直接関係ありません。

$ mvn -v
Apache Maven 3.0.4 (r1232337; 2012-01-17 17:44:56+0900)
Maven home: C:\Users\xxx\maven-3.0.4
Java version: 1.7.0_11, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_11\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

opencsv

最後に肝心の opencsv です。
2013年8月8日の時点で最新である 2.3 を使いました。

JAR のダウンロードは次のページに dependency が載っています。

以下は上記に載っていた dependency です。

<dependency>
    <groupId>net.sf.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>2.3</version>
</dependency>

この dependency を pom.xml に貼り付けて次のコマンドを実行すればローカルリポジトリに JAR がダウンロードされます。

$ mvn eclipse:eclipse -DdownloadSources=true

Maven を使わずに JAR をダウンロードする場合は SourceForge からダウンロードできます。
次は opencsv のダウンロードページです。

2. 確認したい CSV の形式

問題となった CSV の形式についてです。
カラムはそれぞれダブルクォートで囲われているのですが、カラムの文字列に「カンマ」が含まれていると正しく解析されていないとのことでした。
何ともベタなバグです。。。

具体的な CSV は次の通りです。

"01,01", "02,02"

3. テストコードと検証結果

検証に使ったソースコード類は次の通りです。

3-1. CSV ファイル

はじめは動作確認用の CSV ファイルになります。

囲われていないカラム,"01-01","02,02","2013/07/01 10:10:10"

3番目のカラムが検証したいカラムパターン。
それ以外のものは「こんなパターンでも正しく解析してくれるよね?」と確認したかったパターンです。

この CSV は “src/test/resources” ディレクトリに “test.csv” というファイル名で保存しました。

3-2. テストコード

次はテストコードになります。

public class OpenCSVTest {
    
    private CSVReader sut;

    @Before
    public void setUp() throws Exception {
        sut = new CSVReader(new InputStreamReader(
                OpenCSVTest.class.getClassLoader().getResourceAsStream("test.csv"),"UTF-8"));
    }
    
    @After
    public void tearDown() throws Exception {
        if(sut != null) {
            sut.close();
        }
    }

    @Test
    public void test() throws Exception {
        // exercise
        String[] actual = sut.readNext();

        // verify
        assertThat("カラム数が4であること", actual.length, is(4));
        assertThat("1カラム目の内容が正しいこと", actual[0], is("囲われていないカラム")); 
        assertThat("カラムにハイフンがあっても取得できること", actual[1], is("01-01")); 
        assertThat("カラムにカンマがあっても取得できること", actual[2], is("02,02")); 
        assertThat("カラムにスペースがあっても取得できること", actual[3], is("2013/07/01 10:10:10")); 
    }

}

3-3. 検証結果

結果はグリーンになりました。
ダブルクォートで囲われた範囲内にカンマがあっても、そこで区切られることはないようです。
すごい。

4. まとめ

何てこと無い単純な CSV だったので、特にライブラリを使わずに自前で解析処理のコードを書いてましたが、ちゃんとバグを作ってしまいました。
テスト書けよって話にもなりますが、それと合わせて、やっぱりライブラリを使ったほうが工数は減るし安全性も高まるので使わないともったいないなぁっと。

opencsv の JavaDoc をチラ見したら便利そうなクラスがあったので、時間がある時にもうちょっと詳しくみたいと思います。

5. 検証プログラムを Github に登録しました

今回の記事で使用したサンプルプログラムを Github に登録しました。

OpenCSVTest が検証プログラムになります。

6. その他の opencsv に関する記事

opencsv に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-ColumnPositionMappingStrategy

opencsv の ColumnPositionMappingStrategy を使って CSV を Bean に変換する

opencsv を使うと、CSV を読み込んで String の配列に変換してくれます。 Strin

記事を読む

icatch-strategy_mini

opencsv の HeaderColumnNameMappingStrategy を使って CSV を Bean に変換する

opencsv の CSV 読み込み機能の1つで、CSV の1行目がヘッダになっている場合に Bea

記事を読む

icatch-translate_mini

opencsv の HeaderColumnNameTranslateMappingStrategy を使って CSV を Bean に変換する

opencsv の CSV 読み込み機能の1つで、CSV の1行目がヘッダになっている場合に Bea

記事を読む

icatch-dog-ear_mini

opencsv を使って CSV ファイルの読み込み開始行を指定する

opencsv は、読み込むファイルの開始位置を指定することができます。 わざわざ確認する必要もな

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


三 + = 9

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑