Stringクラスの仕組み
Javaには、文字列を扱うStringクラスが存在します。Stringクラスには、多数のメソッドが存在します。
Java プログラム内の “abc” などのリテラル文字列はすべて、このクラスのインスタンスとして実行されます。
一番有名なメソッドはおそらく、文字列の比較に用いるequalsメソッドでしょう。しかし、Stringクラスはこれ以外にもたくさんの便利なメソッドを持っているのです。
ここでは、その中で特にsplitメソッドについて説明していくことにします。
splitメソッド
splitとは、文字通り英語で、分割するという意味であり、その意味の通り、文字列を分割するためのメソッドです。仕様は以下の通りです。
public String[] split(String regex)
regexが、分割方法を現す正規表現です。
正規表現は、通常の文字 (a ~ z など) と、メタキャラクタ と呼ばれる特殊文字から構成される文字列のパターンです。
例えば、[a-zA-Z] という正規表現があると、これは大文字、小文字を含むすべてのアルファベットの文字位置文字と表します。
もちろん、このような複雑な記号ではなく、単なる空白やコンマなどの特定の文字や記号をここに入れても構いません。
事実、splitメソッドがよく使われるのが、スペースや、コンマなど、決められた記号で区切られたデータを文字列の中から取得するようなケースです。
では、実際にサンプルを見てみることにしましょう。
String str = "apple,lemon ,banana ,grape ";
String[] fruit = str.split(",");
とすると、
fruit[0] = "apple";
fruit[1] = "lemon";
fruit[2] = "banana";
fruit[3] = "grape";
が得られます。
データの分割
ところで、splitには、この他に、オーバーロードされた、引数を2つとる記述方法が存在します。仕様は以下の通りです。
public String[] split(String regex, int limit)
と記述する方法があります。
limitは分割回数を表します。戻り値としては、分割した文字列の配列が帰ってきます。
つまり、指定した区切りで、文字列を分割するということを意味します。
この引数はパターンの適用回数、つまり、返される配列の長さを制御しているのです。
値がn(>0)であったとすると、このパターンは n – 1回以下の回数が適用され、配列の長さは n 以下になります。
配列の最後のエントリには、最後にマッチした区切り文字以降の入力シーケンスがすべて含まれます。
ただし、n が負の値の場合、このパターンの適用回数と配列の長さは制限されません。
そして、n がゼロの場合、このパターンの適用回数と配列の長さは制限されません。ただし、後続の空の文字列は破棄されるというルールがあります。
例えば、以下のような処理があったとします。
String str = "apple,,lemon ,banana ,grape,,,";
String[] fruit = str.split(",", 0);
となっている場合には、
fruit[0] = "apple";
fruit[1] = "";
fruit[2] = "lemon";
fruit[3] = "banana";
fruit[4] = "grape ";
ですが、これを、
String str = "apple,,lemon ,banana ,grape,,,";
String[] fruit = str.split(",", -1);
とすると、
fruit[0] = "apple";
fruit[1] = "";
fruit[2] = "lemon";
fruit[3] = "banana";
fruit[4] = "grape";
fruit[5] = "";
fruit[6] = "";
fruit[7] = "";
といった具合になります。
つまり、-1の場合、末尾の位置で空白だけが入る配列要素は格納されます。
なお、splitでは、指定した正規表現が無効な場合、PatternSyntaxExceptionと言う例外が発生しますので、条件の指定には気をつけましょう。
csvデータの読み込み
このように、splitは、一つの文字列をパターンに応じて、複数の文字列に分割するわけですが、この処理は、何らかのファイルを読み取り、そのフォーマットにしたがってデータを読み取らなければならないようなケースには大変便利です。
その一番典型的なケースがcsvフォーマットです。
csvフォーマットとは
csvフォーマットとは、テキスト形式のデータフォーマットの一種で、最も普及したデータ交換用フォーマットの一つです。
csvとはComma-Separated Valuesの略で、カンマ区切りで並べた値という意味です。
ただ、このフォーマットはいくつか方言があり、データ間を「,」ではなく半角スペースで区切ったようなケースも存在します。また、変わったところでは、(タブ)で区切る場合もあります。これを特にTSV(Tab-Separated Values)と呼ぶ場合もあります。
しかし、ここではあくまでも一番典型的な,で区切る例を見てみることにしましょう。実際のCSVデータは、
"Family","Name","Birthday","Zipcode","Address","Telephonenumber"
"Yamada","Taro","1981/12/3","100-0002","Tokyo","03-1234-5678"
"Yamamoto","Hanako","2001/1/4","100-0002","Tokyo","03-5454-1212"
といった具合になります。また、データが数値のみの場合は、
10,200,300
30,400,500
といった具合に、数値を,で区切るだけで十分です。
CSVデータのつくり方
こういったCSVデータは、コンマで区切られた単なる文字列などの羅列であることから、テキストエディタで簡単に作れますが、EXCELでも簡単に作成・編集をすることが出来ます。
EXCELのセルにデータを入力し、保存形式でcsvファイルを形式すると、そのデータはcsvファイルで保存されます。
また、逆に保存したcsvファイルをEXCELで読み出すことも可能です。
JavaでCSVデータを読み込む
以上を踏まえて、実際にJavaでCSVデータを読み込んで表示するプログラムを作ってみましょう。
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class CSVFileReader {
public static void main( String[] args ) {
try {
BufferedReader br
= new BufferedReader( new FileReader("data.csv") );
// ファイルを行単位で読む
String s;
while( (s = br.readLine()) != null ) {
// 読み込んだ行を、「,」で分割する
String array[] = s.split( "," );
// 内容を出力する
for(String str : array){
System.out.print(str+" ");
}
System.out.println();
}
br.close();
} catch( IOException e ) {
System.out.println( "入出力エラーがありました" );
}
}
}
では、プログラムを解説していきましょう。
まず、
BufferedReader br = new BufferedReader( new FileReader("data.csv") );
で、ファイルの読み込みの準備をしています。ここでは、”data.csv”というファイル名にしていますが、この部分は適切なパスとファイル名に変えてください。
これをもとに、ファイルを一行ずつ読み込んでいきます。
while( (s = br.readLine()) != null ) {
の部分で、一行ずつファイルを読み込んでいきます。読み込みが終了すると、nullが来るので、これはcsvファイルの最終行に車で繰り返されます。読み込んだ行の文字列は、変数sに代入されます。
そして、
String array[] = s.split( "," );
で、sをコンマで複数に区切ります。
例えば、読み込んだデータが、「1,2,3」であれば、
array[0] = "1";
array[1] = "2";
array[2] = "3";
という値が入った配列が生成されます。こうして生成されたデータを、最終的に拡張for文を用いて表示しています。
このように、Stringクラスのsplitメソッドを使うと、簡単にcsvファイルの読み込みができるようになります。
まとめ
Stringクラスのsplitメソッドは、以上のように何らかのファイルフォーマットを読み込んでそこからデータを抽出したいという場合に非常に便利です。
現在、もともとJavaはXMLファイルも、jsonファイルも読み出すことが出来るAPIが備わってはいますが、プログラミングの学習初期などに、練習として自分自身でこういったフォーマットを解釈し、ファイルを読み出すプログラムを作ってみることも良いでしょう。
Javaが使える方は高単価な仕事ができる可能性があるので下記記事もぜひご覧くださいませ!
【関連記事】
▶Java案件のイマがわかる!知って見つかる最適案件