テキストファイルに書き込む
2次元ListをCSVファイルにする
2次元のArrayListをCSVファイルとして保存しましょう。
ArrayList<ArrayList<String>> → CSVファイル
今回も
カンマで区切られただけの
単純な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)
| 要素番号 | 0 | 1 | 2 | 3 | 4 |
| 要素 | 東郷 美森 | とうごう みもり | 青 | 朝顔 | 国防仮面 |
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 しました。
2次元のArrayListを
CSVファイルにするには、
1行分の要素を結合して
文字列にする部分が肝だな。
この部分を作り込めば、複雑なCSVファイルにも対応できるようになります。
あ~。
やってることは
何となくわかりますね。
今回はArrayListだったけど、
配列でもできる。
試してみてくれ。
BufferedWriter おわり。