2次元ListをCSVファイルにする - 萌えJava超入門
テキストファイルに書き込む

2次元ListをCSVファイルにする

2次元のArrayListをCSVファイルとして保存しましょう。

ArrayList<ArrayList<String>> → CSVファイル

萌えJava超入門
今回も
カンマで区切られただけの
単純なCSVファイルを扱う。
すまんがよろしく頼む。

目次

1.サンプルコード


「yuyuyu_ms932.csv」というファイルを作成して、
2次元ArrayListの 「list2D」 の中の文字列を、CSV形式で書き込むサンプルです。
ここでの「CSV形式」は、要素を ',' (カンマ)で区切っただけの単純なものです。

//WriteFile_01.java

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.UnsupportedEncodingException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

class WriteFile_01 {

    public static void toStringArray2D(
                String[][] array2D,
                File inputFile,
                String encoding,
                String delimiters
    ){

        String[] lines = new String[array2D.length];
        for(int i=0; i< array2D.size(); i++){
            String line = arrayToString(array2D[i]);
            lines.add(line);
        }

        try {
            BufferedWriter bw = new BufferedWriter(
                      new OutputStreamWriter(
                          new FileOutputStream(inputFile), encoding
                      )
            );

            for(String str :lines){
                bw.write(str);
                bw.newLine();
            }
            bw.close();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    private static String arrayToString(
                String[] array,
                String delimiters
    ){
        StringBuilder strb = new StringBuilder();
        for(int i=0; i<array.length; i++){
            if(strb.length>0){
                strb.append(delimiters);
            }
            strb.append(array[i]);
        }
        return strb.toString();
    }

}

//Sample15_01.java

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

class Sample15_01{
    public static void main(String[] args){

        final String DELIMITERS = ",";//区切り文字
        String path = "yuyuyu_ms932.csv";
        File file = new File(path);
        /*書き込むデータ(list2D)を準備します。
              (リテラルがわかりやすいので配列で記述しました。)*/
        String[][] array2D = {
          {"お名前", "おなまえ","勇者服","刻印","特記事項"},
          {"結城 友奈","ゆうき ゆうな","桃色","桜 ","知的に見える伊達メガネ"},
          {"東郷 美森","とうごう みもり","青","朝顔","国防仮面"},
          {"犬吠埼 風","いぬぼうざき ふう","黄色","オキザリス","女子力斬り"},
          {"犬吠埼 樹","いぬぼうざき いつき","緑","鳴子百合","Deathの正位置"},
          {"三好 夏凜","みよし かりん","赤","サツキ","にぼっしー"}
          };
        //配列をArrayListに変換します。
        ArrayList<ArrayList<String>> list2D = new ArrayList<ArrayList<String>>();
        for(String[] strs :array2D){
            List<String> list = Arrays.asList(strs);
            ArrayList<String> alistA = new ArrayList<String>(list);
            list2D.add(alistA);
        }
        /*ここまで list2D の準備でした。*/

        //2次元のArrayListを、一行ずつカンマ区切りの文字列にします。
        String[] csvLines = new String[list2D.size()];
        for(int i=0; i<csvLines.length; i++){
            ArrayList<String> alistB = list2D.get(i);
            StringBuilder strb = new StringBuilder();
            for(int j=0; j<alistB.size()-1; j++){
                strb.append(alistB.get(j));
                strb.append(DELIMITERS);//DELIMITERS がカンマです。
            }
            strb.append(alistB.get(alistB.size()-1));
            csvLines[i] = strb.toString();
        }

        //書き込みます。
        try {
            BufferedWriter br = new BufferedWriter(
                new OutputStreamWriter(
                        new FileOutputStream(file), "MS932"
                )
            ); 

            for(String str :csvLines){
                br.write(str);
                br.newLine();
            }
            br.close();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample15_01.java
ws>java Sample15_01

Sample15_01.java を実行したフォルダに「yuyuyu_ms932.csv」ファイルができていると思います。
中身を確認してみて下さい。




2.解説


あらためて Sample15_01.java の中を見てみましょう。

ファイルに文字列を書き込む部分は、
前のページで紹介したサンプルコードと変わりません。
新しいのは、1行分の要素「list2D.get(i)」を、
カンマで区切った一つの文字列「csvLines[i]」にする部分だけです。

ArrayList<String> list2D.get(2)
要素番号01234
要素東郷 美森とうごう みもり朝顔国防仮面

String csvLines[2]
文字列 東郷 美森,とうごう みもり,,朝顔,国防仮面

結合する部分のソースコードを抜粋しました。(↓)
ご参照ください。

Sample15_01.java 抜粋
カンマで区切った一つの文字列にする部分

String[] csvLines = new String[list2D.size()]; //結果を保存する配列

for(int i=0; i<csvLines.length; i++){
    ArrayList<String> alistB = list2D.get(i); //一行取り出し
    StringBuilder strb = new StringBuilder(); //要素を結合するStringBuilder

    for(int j=0; j<alistB.size()-1; j++){ //結合
        strb.append(alistB.get(j));
        strb.append(DELIMITERS);//DELIMITERS がカンマです。
    }
    strb.append(alistB.get(alistB.size()-1)); //最後の要素を append
    csvLines[i] = strb.toString(); //一行分の文字列を保存
}


StringBuilderクラスを使って要素とカンマを交互に append しただけです。
最後の要素だけは、後ろにカンマを付けたくないので、for文の外で append しました。
萌えJava超入門
2次元のArrayListを
CSVファイルにするには、
1行分の要素を結合して
文字列にする部分が肝だな。
この部分を作り込めば、複雑なCSVファイルにも対応できるようになります。

萌えJava超入門 萌えJava超入門
あ~。
やってることは
何となくわかりますね。
萌えJava超入門
今回はArrayListだったけど、
配列でもできる。
試してみてくれ。



BufferedWriter おわり。




© 2019 awasekagami