« WebObjects:CSVレスポンスの実装 | トップページ | Java:CSVパーサを作る(その2) - RFC4180対応 前編 »

Java:CSVパーサを作る(その1) - 簡易パーサ

データベースやExcelなどにデータをインポート・エクスポートする際に使用されるファイルフォーマットとしてCSVがあります。
CSVを単にカンマでフィールドを区切り,改行でレコードを区切ったテキストデータと見るならば,JavaでCSVファイルをインポートしてデータベースに読み込ませるなどの処理を行うCSVパーサを作るには,BufferedReaderクラスのreadLineメソッドでレコードを取り出し,Stringクラスのsplitメソッドでフィールドに分割すれば,それでCSVパーサができあがります。
この場合の具体的なプログラムを以下に例示します。

■処理の概要
このCSVパーサでは,以下の処理をファイルの最後まで繰り返し実行します。

  1. 読み込んだCSVデータから1行を1レコードとして取り出します。
  2. 1レコードをフィールドに分割してStringクラスインスタンスのリストを作ります。
  3. 1レコード分のフィールドのリストをレコード処理メソッド(「readColumns」)に渡します。
CSVパーサクラス及びreadColumnsメソッドはabstractとし,派生クラスでreadColumnsメソッドの処理を実装するものとします。派生クラスのreadColumnsメソッドでは,CSVパーサで生成した1レコード分のフィールドのリストをデータベースへ登録する処理などを実装します。
CSVファイルの文字コードは「Windows-31J/MS932」とします。これはExcelで開けるCSVの文字コードに合わせています。

簡易CSVパーサプログラム

//------------------------------------------------------------------
/**
 * CSVファイルの読み込み。
 * @param stream 入力ストリーム。FileInputStream,ByteArrayInputStreamなど。
 */
public void read (
  InputStream stream)
{
  InputStreamReader reader = null;
  BufferedReader   buff = null;
  try {
    reader = new InputStreamReader(stream, "MS932");
    buff = new BufferedReader(reader);
    String  record;
    String[] columns;
    int   lineNum = 0;

    while ((record = buff.readLine()) != null) {
      lineNum++;
      if (record.length() <= 0)
        continue;
      columns = record.split(",");
      if (0 < columns.length) {
        readColumns(columns, lineNum);
      }
    }
  }
  catch (Exception ex) {
    ex.printStackTrace();
  }
  finally {
    try {
      if (buff != null) {
        buff.close();
      }
      if (reader != null) {
        reader.close();
      }
      stream.close();
    }
    catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

//------------------------------------------------------------------
/**
 * 読み込んだ1レコード分のデータをDBに取り込む。
 * 実際の処理は派生クラスで実装。
 * @param columns 1レコードをフィールドに分割した文字列リスト。
 * @param lineNum CSVの行番号(エラーが発生したときの行番号記録用)。
 */
abstract protected void readColumns (String[] columns, int lineNum);


次回は,この簡易パーサを拡張して「RFC4180」に対応したCSVパーサへの拡張を試みます。



※上記コードでは,整形のため全角スペースを使用している部分があります。
【著作権表記】上記コードを含む本ブログのプログラムコードは,私的利用可,商用利用可,改変しての利用可です。利用の際に作者に許諾を得る必要はありません。

■関連情報
CSVの仕様:RFC4180日本語訳)(Wikipedia
Microsoftコードページ932(Wikipedia
WebObjects:CSVレスポンスの実装

■関連書籍をAmazonで検索:[Java]
Java謎+落とし穴徹底解明



にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ プログラム・プログラマへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。
▼CSVパーサを作る[その1][][]
ドミノ・ピザ【PC向けサイト】

|

« WebObjects:CSVレスポンスの実装 | トップページ | Java:CSVパーサを作る(その2) - RFC4180対応 前編 »

プログラミング」カテゴリの記事

Java」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: Java:CSVパーサを作る(その1) - 簡易パーサ:

« WebObjects:CSVレスポンスの実装 | トップページ | Java:CSVパーサを作る(その2) - RFC4180対応 前編 »