Thinkers'Studio
JavaとC言語の自習ツール
csvファイルの入出力(条件と一致するデータの抽出)

 csvファイルからの入力は、以前の Tips で紹介しました。今回は、データを csv形式ファイル出力する例です。
 それだけでは面白くないので、csvファイルから入力し、指定した条件に合致するデータを抽出して別の csvファイルに出力する例とします。

csv入出力の課題

 各行が(店舗コード, 年月日, 売上金額)の売上データファイル sales.csv があります。 「店舗コード」と「年月」をコマンドラインから指定すると、それらの条件に該当する売上データをファイルに書き出すプログラムを作りなさい。
 出力ファイル名は "店舗コード_YYYYMM.csv"、各行は (売上日, 売上金額)、売上日は年月日の日付部分とします。

(例) コマンドラインに "125 201402" と指定したとき
 店舗コード125 の 2014年2月の売上データが "125_201402.csv" ファイルに出力されます。

sales.csv
110,20140201,256000
110,20140202,273450
  :
125,20140201,153000
125,20140202,196400
  :
125,20140228,143550
 
 ====> 
抽出結果の 125_201402.csv
01,153000
02,196400
  :
28,143550

処理手順

 練習問題としてやってみるのもよいかも知れません。 大まかな手順は次の通りです。
  1. コマンドラインから抽出条件を指定する
  2. 元の csvファイルから入力し、行データを列に分解する
  3. 列データの一部が、指定した抽出条件と一致するか調べる
  4. 一致するデータ行から必要な部分だけを csv形式で出力する
【 プログラム例 】
 エラーチェックは、args の数が 2 で年月の指定が 6桁か、元の csv の列数が 3かどうかだけを調べています。
import java.io.*;

class SalesData {
    public static void main( String[] args ) {
        if( args.length != 2 || args[1].length() != 6 ) {
            System.out.println( "店舗コード 年月(YYYYMM)を指定してください" );
            return;
        }
        try {
            String outcsv = args[0]+"_"+args[1]+".csv";
            BufferedReader br
                = new BufferedReader( new FileReader("sales.csv") );
            BufferedWriter bw
                = new BufferedWriter( new FileWriter(outcsv) );
            String s;
            int cnt = 0;

            //行単位で読む
            while( (s = br.readLine()) != null ) {
                String array[] = s.split( "," ); //カンマで分割
                if( array.length != 3 )
                    throw new IOException( "csv列数に問題(出力済み:"+cnt+")" );
                //抽出条件に一致? (1列目は店舗コード?, 2列目の6文字はYYYYMM?)
                if( args[0].equals(array[0]) && 
                    args[1].equals(array[1].substring(0,6)) ) {
                    bw.write( array[1].substring(6,8) + "," + array[2] );
                    bw.newLine();
                    cnt++;
                }
            }
            br.close(); bw.close();
            System.out.println( outcsv + "("+cnt+"行)が出力されました" );
        } catch( Exception e )  {
            System.out.println( e );
        }
    }
}
 下記は、各手順で使用したメソッドなどを整理したものです。
  1. args の内容を調べる
  2. 行の入力は BufferedReader クラスの readLine( )、文字列の分解には Stringクラスの split( ) を使う
  3. 部分文字列の取出しには Stringクラスの substring( )、一致を調べるには equals( )
  4. 出力には BufferedWriter クラスの write( ) を使う。 csv 形式での出力は、"," を挟んで出力するだけです。

(今週のクイズです)
 sales.csv は必ず店舗コードの昇順に並んでいるとして、全店舗コードを重複無くファイル出力するにはどうすればよいでしょう?
   (答えは、次の Java の Tips で ・・・ )

[ 関連記事 ] csvファイルから入力するには, 部分文字列を返すsubstring


 前回 のクイズはありませんでした