コントロールブレイク処理
キーブレイクとも呼ばれる.
ある項目をキーとして,キーが変わるまで集計したり一定の処理をしたりするプログラム.
ある項目をキーとして,キーが変わるまで集計したり一定の処理をしたりするプログラム.
例えば,以下のようなデータファイル(都道府県名,市町村名,人口)を集計して出力するには…
sampleData.bat
埼玉県,さいたま市,1063206
埼玉県,川越市,335107
千葉県,千葉市,916656
千葉県,銚子市,76030
東京都,千代田区,39226
東京都,中央区,85741
神奈川県,横浜市,3548595
神奈川県,川崎市,1302731
埼玉県,川越市,335107
千葉県,千葉市,916656
千葉県,銚子市,76030
東京都,千代田区,39226
東京都,中央区,85741
神奈川県,横浜市,3548595
神奈川県,川崎市,1302731
sample code
import java.io.*;
import java.util.*;
class CBreakSample {
public static void main( String [] args ) {
int n = 1; // 入力データの行数
String line = null; // 入力された行
try {
FileReader fr = new FileReader( "C:\\sampleData.bat" );
BufferedReader br = new BufferedReader( fr );
String key = null; // コントロールのためのキー
int sum = 0;
while( ( line = br.readLine() ) != null ) {
StringTokenizer st = new StringTokenizer( line, "," );
String 県の名前 = st.nextToken();
String 市の名前 = st.nextToken();
int value = Integer.parseInt( st.nextToken() );
if( n != 1 ) // 最初のデータでなければ(最初のデータは何もしない) {
if( !key.equals( 県の名前 ) ) // ブレイクした {
System.out.println( " 合計:" + sum );
sum = 0;
key = 県の名前;
}
} else {
key = 県の名前; // 最初のデータなのでキーに県名をセットする
System.out.println( 県の名前 + "\t" + 市の名前 + "\t" + value );
sum += value;
n++;
}
System.out.println( " 合計:" + sum );
}
catch( FileNotFoundException e ) {
System.out.println( "入力ファイル「input.dat」が無い" );
}
catch( IOException e ) {
System.out.println( "ファイル入力中にエラー発生" );
}
catch( NoSuchElementException e ) {
System.out.println( "\nError " + n + "行目:" + line + "\nデータの項目が足りない" );
}
catch( NumberFormatException e ) {
System.out.println( "\nError " + n + "行目:" + line + "\n数値定数に誤りがある" );
}
}
}
結果出力:
埼玉県 さいたま市
埼玉県 川越市 335107
合計:1398313
千葉県 千葉市 916656
千葉県 銚子市 76030
合計:992686
東京都 千代田区
東京都 中央区 85741
合計:124967
神奈川県 横浜市
神奈川県 川崎市
合計:4851326
埼玉県 川越市 335107
合計:1398313
千葉県 千葉市 916656
千葉県 銚子市 76030
合計:992686
東京都 千代田区
東京都 中央区 85741
合計:124967
神奈川県 横浜市
神奈川県 川崎市
合計:4851326
典型的なコントロールブレイク処理.
ポイントは,県名をkeyへセットして,それが等しい間反復処理を行い人口の合計処理を行っている.よってファイルはこの処理を行う前に「県名で昇順(または降順)にソート」しておく必要がある.
コントロールブレイク処理は、SQL文の場合、「GROUP BY 」に相当する.上記のような処理は「COBOL言語」が得意
とするところだが,SQL文で上記の処理を記述した場合は以下のようになる.
ポイントは,県名をkeyへセットして,それが等しい間反復処理を行い人口の合計処理を行っている.よってファイルはこの処理を行う前に「県名で昇順(または降順)にソート」しておく必要がある.
コントロールブレイク処理は、SQL文の場合、「GROUP BY 」に相当する.上記のような処理は「COBOL言語」が得意
とするところだが,SQL文で上記の処理を記述した場合は以下のようになる.
SELECT 都道府県名, SUM(人口) AS 人口合計 FROM sampleData.bat GROUP BY 都道府県名