その前の「JavaでCSV形式のファイルを読み書きするライブラリソースと使用例(BufferedReaderとFileReaderを利用する)」の中にBufferedReaderとFileReader利用して、CSV形式のファイル読み込む処理を紹介しました。

ある本によっては、JavaでCSVやタブ区切りファイルを読み込む場合、java.io.StreamTokenizerを利用して区切るようになる場合もありますが、StreamTokenizerなら数字と文字が混在する場合(住所など)は、ちと面倒になってきます。

実は、Javaのv1.4以降であれば、splitが入ってるので、こいつを使うと、簡単に処理できます。

まずは、split関数の機能と引数の説明です。 JDKのJavaDoc中にもあります。必要であればJDKの公式サイトへ参考してください。

  1. ●文字を切る
  2. split
  3.  これは、引数の文字が現れると、そこできります(その文字は入りません)
  4. たとえば”abcafg”で切る文字を”a”にすると
  5.    String[0] 空文字列(1文字目の”a”の前に文字はない)
  6.    String[1] bc
  7.    String[2] fg
  8. と入ります。
  9.  カンマ区切りのようなものの場合、便利です。
  10.  ただし、これも、正規表現なので、引数に注意です。

以下はsplitを使ってCSVファイル読み込む方法です。

1)、ファイル全体を読んできてしまう

  1. File f = new File(ファイル名);
  2. byte[] b = new byte[(int) f.length()];
  3. FileInputStream fi = new FileInputStream(f);
  4. fi.read(b);
  5. String s = new String(b);

とすると、sにすべてのデータが文字列で入ってきます。
2)、改行でsplitして、レコードのString配列をつくる

  1. String[] strrec = s.split(Ӵn);

3)、そのString配列の1要素ごとに、タブ(あるいはカンマ)できって、セルにわける(ここでは、1レコード分をVectorにいれてる)

  1.   Vector rec = new Vector();
  2.   for (int i = 0 ; istrrec.length ; i ++ )
  3.   {
  4.     rec.add(strrec[i].split(Ӵt));
  5.   }

4)、Csvクラスにreadというメソッド仕様

  1. public static Vector read(String filename);
  2. 引数 filename 読み込むタブ区切りファイル
  3. 返り値 null   エラーあり
  4.     それ以外 レコード
  5.      Vectorの1要素が1レコードで、型はString[]

5)、CSVクラス実装

タブ区切り読み込みクラス
 実際にsplitを使って読み込むクラス(上記説明内容のもの)は、
以下のとおり

  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. /**
  5. * CSV、タブ区切り読み書き
  6. */
  7. public class Csv {
  8.     public static Vector read(String filename)
  9.     {
  10.  
  11.         //==================================//
  12.         //                //
  13.         //    ファイル読み込み        //
  14.         //                //
  15.         //==================================//
  16.         String s = null;        //    入力文字列
  17.  
  18.         //    ファイル読み込み
  19.         try
  20.         {
  21.             File f = new File(filename);
  22.             byte[] b = new byte[(int) f.length()];
  23.             FileInputStream fi = new FileInputStream(f);
  24.             fi.read(b);
  25.             s = new String(b);
  26.         }
  27.         catch(Exception e)
  28.         {
  29.             return null;
  30.         }  
  31.         if ( s    ==    null )
  32.         {
  33.             return null;
  34.         }
  35.         //==================================//
  36.         //                //
  37.         // 文字列をVectorに入れる     //
  38.         //                //
  39.         //==================================//
  40.         Vector rec = new Vector();
  41.         if ( rec    ==    null )
  42.         {
  43.             return null;
  44.         }
  45.  
  46.         s = s.replaceAll(”¥r”,”");    // ¥rがあったとき対策
  47.         String[] strrec = s.split(”¥n”);
  48.         int i;
  49.         for (i = 0 ; i < strrec.length ; i ++ )
  50.         {
  51.             rec.add(strrec[i].split(”¥t”));
  52.         }
  53.  
  54.         return    rec;
  55.     }
  56. }

6)、使用例

そのCsv.readを呼び出すソースはこんなかんじ

  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class test {
  5.     /*
  6.      *     メイン処理(呼び出し元)
  7.      */
  8.     public static void main(String[] args) {
  9.         int i,j;
  10.         //    タブ区切りファイルの読み込み
  11.         Vector rec    =    Csv.read(test.txt);
  12.         if ( rec    ==    null )
  13.             return;
  14.  
  15.         //    内容表示          
  16.         for(i = 0 ; irec.size() ; i ++ )
  17.         {
  18.             System.out.print(i+”番目”);
  19.             String[] cell = (String[])rec.elementAt(i);
  20.             for(j = 0 ; jcell.length ; j ++ )
  21.             {
  22.                 System.out.print(”:”+cell[j]);
  23.             }
  24.             System.out.println();
  25.         }
  26.     }
  27. }

タグ区切るのみの場合、splitを使うと簡単ですね。

メインコンテンツEND ■
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 2.00 out of 5)
Loading ... Loading ...

Posted on Monday, 11th May 2009 by admin

Tags: , , ,
Posted in Java | Comments (0) | 32,942 views

Leave a Reply