その前の「JavaでCSV形式のファイルを読み書きするライブラリソースと使用例(BufferedReaderとFileReaderを利用する)」の中にBufferedReaderとFileReader利用して、CSV形式のファイル読み込む処理を紹介しました。
ある本によっては、JavaでCSVやタブ区切りファイルを読み込む場合、java.io.StreamTokenizerを利用して区切るようになる場合もありますが、StreamTokenizerなら数字と文字が混在する場合(住所など)は、ちと面倒になってきます。
実は、Javaのv1.4以降であれば、splitが入ってるので、こいつを使うと、簡単に処理できます。
まずは、split関数の機能と引数の説明です。 JDKのJavaDoc中にもあります。必要であればJDKの公式サイトへ参考してください。
- ●文字を切る
- ・split
- これは、引数の文字が現れると、そこできります(その文字は入りません)
- たとえば”abcafg”で切る文字を”a”にすると
- String[0] 空文字列(1文字目の”a”の前に文字はない)
- String[1] bc
- String[2] fg
- と入ります。
- カンマ区切りのようなものの場合、便利です。
- ただし、これも、正規表現なので、引数に注意です。
以下はsplitを使ってCSVファイル読み込む方法です。
1)、ファイル全体を読んできてしまう
- File f = new File(ファイル名);
- byte[] b = new byte[(int) f.length()];
- FileInputStream fi = new FileInputStream(f);
- fi.read(b);
- String s = new String(b);
とすると、sにすべてのデータが文字列で入ってきます。
2)、改行でsplitして、レコードのString配列をつくる
- String[] strrec = s.split(”¥n”);
3)、そのString配列の1要素ごとに、タブ(あるいはカンマ)できって、セルにわける(ここでは、1レコード分をVectorにいれてる)
- Vector rec = new Vector();
- for (int i = 0 ; i < strrec.length ; i ++ )
- {
- rec.add(strrec[i].split(”¥t”));
- }
4)、Csvクラスにreadというメソッド仕様
- public static Vector read(String filename);
- 引数 filename 読み込むタブ区切りファイル
- 返り値 null エラーあり
- それ以外 レコード
- Vectorの1要素が1レコードで、型はString[]
5)、CSVクラス実装
タブ区切り読み込みクラス
実際にsplitを使って読み込むクラス(上記説明内容のもの)は、
以下のとおり
- import java.io.*;
- import java.util.*;
- /**
- * CSV、タブ区切り読み書き
- */
- public class Csv {
- public static Vector read(String filename)
- {
- //==================================//
- // //
- // ファイル読み込み //
- // //
- //==================================//
- String s = null; // 入力文字列
- // ファイル読み込み
- try
- {
- File f = new File(filename);
- byte[] b = new byte[(int) f.length()];
- FileInputStream fi = new FileInputStream(f);
- fi.read(b);
- s = new String(b);
- }
- catch(Exception e)
- {
- return null;
- }
- if ( s == null )
- {
- return null;
- }
- //==================================//
- // //
- // 文字列をVectorに入れる //
- // //
- //==================================//
- Vector rec = new Vector();
- if ( rec == null )
- {
- return null;
- }
- s = s.replaceAll(”¥r”,”"); // ¥rがあったとき対策
- String[] strrec = s.split(”¥n”);
- int i;
- for (i = 0 ; i < strrec.length ; i ++ )
- {
- rec.add(strrec[i].split(”¥t”));
- }
- return rec;
- }
- }
6)、使用例
そのCsv.readを呼び出すソースはこんなかんじ
- import java.io.*;
- import java.util.*;
- public class test {
- /*
- * メイン処理(呼び出し元)
- */
- public static void main(String[] args) {
- int i,j;
- // タブ区切りファイルの読み込み
- Vector rec = Csv.read(”test.txt”);
- if ( rec == null )
- return;
- // 内容表示
- for(i = 0 ; i < rec.size() ; i ++ )
- {
- System.out.print(i+”番目”);
- String[] cell = (String[])rec.elementAt(i);
- for(j = 0 ; j < cell.length ; j ++ )
- {
- System.out.print(”:”+cell[j]);
- }
- System.out.println();
- }
- }
- }
タグ区切るのみの場合、splitを使うと簡単ですね。
Posted on Monday, 11th May 2009 by admin
Tags: CSV, Java, Split, StreamTokenizer
Posted in Java | Comments (0) | 17,831 views

