Javaでsplitを使ってCSVファイル読み込み

その前の「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を使うと簡単ですね。

Leave a Reply

Your email address will not be published. Required fields are marked *