2005年8月16日火曜日

JAVA 「文字区切り処理」

アプリケーションを作成していると設定データやCSV形式(カンマ、タブ区切り)のデータを読み込んで処理することが多々あります。
その際につきものなのが文字区切りの処理です。
今回は文字区切り処理についていくつかのサンプルを紹介します。

まず、処理する文字列をCSV形式のタブ区切りで表した場合を今回のサンプルとします。
サンプルデータ->String sampleMoji = "文字 hoge hoge? "

1.思いっきり解析
JavaのAPIがよくわかりませんという方は文字列内からカンマを見つけて文字を抜き出すというロジックを組むでしょう。

String sampleMoji = "文字 hoge hoge? ";
Vector moji = new Vector();
StringBuffer buf = new StringBuffer();
for(int idx=0; idx < sampleMoji.length() ; idx++){
 if(sampleMoji.charAt(idx) == '\t'){// sampleMoji.toCharArray()[idx] == '\t'でもいいよね
  moji.addElement(buf.toString());
  buf.delete(0,buf.length());
 }
 else{
 buf.append(sampleMoji.charAt(idx));
 }
}
System.out.println(moji.toString());

実行結果:[文字, hoge, , hoge?]
文字、hoge、なし、hoge?となる

2.インデックス処理
StringクラスのindexOf()とsubstring()を利用してもできます。
indexOf(探したい文字,開始位置) -> 見つかった文字の位置
substring(開始位置,終了位置) -> 指定した開始から終了までの文字

String sampleMoji = "文字 hoge hoge? ";
Vector moji = new Vector();
for(int idx=0, idx2=0; idx < sampleMoji.length(); idx++){
 if((idx=sampleMoji.indexOf("\t",idx))<0){
  moji.addElement(sampleMoji.substring(idx2));
  break;
 }
 moji.addElement(sampleMoji.substring(idx2,idx));
 idx2 = idx+1;
}
System.out.println(moji.toString());

実行結果:[文字, hoge, , hoge?]
文字、hoge、なし、hoge?となる

3.トークン処理
StringTokenizerというクラスを利用したらなんかシンプルになったけど実行結果が少し違う。

String sampleMoji = "文字 hoge hoge? ";
Vector moji = new Vector();
StringTokenizer tok = new StringTokenizer(sampleMoji,"\t");
while( tok.hasMoreTokens() ) {
 moji.addElement(tok.nextToken());
}
System.out.println(moji.toString());

実行結果:[文字, hoge, hoge?]
文字、hoge、hoge?となる

4.スプリット処理
ver1.4からStringクラスにsplit()っていうのがあるみたいなので利用した。いきなり区切り処理が終わって配列が返ってきます。

String sampleMoji = "文字 hoge hoge? ";
Vector moji = new Vector();
String[] mojimoji = sampleMoji.split("\t");
for(int i=0; i < mojimoji.length; i++){
 moji.addElement(mojimoji[i]);
}
System.out.println(moji.toString());

実行結果:[文字, hoge, , hoge?]
文字、hoge、なし、hoge?となる

とまあこんな感じです。
文字の区切り処理といってもやり方がいろいろあるので試してみてください。