31.
CSVファイル操作
モデルファイルとCSV作成
商品データをCSV形式で作成し、ArrayListやHashMapのデータに変換してみましょう。
ファイル構成
./
├── data/
│ └── item.csv
├── src/
│ └── rpg/
│ │ └── item/
│ │ ├── Item.java
│ │ ├── ItemList.java
│ │ └── ItemType.java
│ └── ItemListApp.java
CSVファイル
CSVファイル「data/item.csv」を作成し、商品データを追加しておきいます。
id,name,type,price,attack_power,defence_power
1,ブロンズナイフ,weapon,300,5,0
2,シルバーナイフ,weapon,500,8,0
3,ブロンズアーマー,armor,500,0,3
4,シルバーアーマー,armor,800,0,6
5,ブロンズシールド,shield,300,0,2
6,シルバーシールド,shield,500,0,4
ItemTypeの作成
「WEAPON」「ARMOR」「SHIELD」のenum ItemTypeを作成します。
item.ItemType.java
package rpg.item;
public enum ItemType {
WEAPON, ARMOR, SHIELD;
}
ItemListの作成
ItemListクラスを作成し、ArrayListとHashMapのインスタンス変数を初期化とコンストラクタを追加します。
item.ItemType.java
package rpg.item;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class ItemList {
public ArrayList<Item> list = new ArrayList<>();
public Map<Long, Item> map = new HashMap<>();
public ItemList() {
}
}
CSV処理
CSVファイルパス
ItemTypeクラスに、CSVファイルのパスを定数で設定します。
item.ItemType.java
public class ItemList {
private static String CSV_PATH = "data/item.csv";
...
}
CSV読み込み(1行目)
loadCSV() 作成
CSV読み込みメソッドloadCSV() を作成し、コンストラクタで実行します。loadCSV() ではファイル操作の変数を用意しておきます。
item.ItemType.java
public class ItemList {
private final static String CSV_PATH = "data/rpg/item.csv";
public ArrayList<Item> list = new ArrayList<>();
public Map<Long, Item> map = new HashMap<>();
public ItemList() {
// コンストラクタで実行
this.loadCsv();
}
// CSV読み込みメソッド
public void loadCsv() {
//ファイル操作の変数用意
FileInputStream file;
InputStreamReader reader;
BufferedReader buffer;
}
}
CSV読み込み(1行目)
CSVファイルを開き、1行読み込みます。ファイルを開くときは、try-catchが必要です。
item.ItemType.java
public void loadCsv() {
FileInputStream file;
InputStreamReader reader;
BufferedReader buffer;
try {
// ファイル操作
file = new FileInputStream(CSV_PATH);
reader = new InputStreamReader(file);
buffer = new BufferedReader(reader);
// 1行読み込み
String line = buffer.readLine();
System.out.println(line);
} catch (Exception e) {
System.out.println(CSV_PATH + "が読み込めませんでした");
} finally {
}
}
ファイルから1行読み込みました。
結果
id,name,type,price,attack_power,defence_power
CSV読み込み(2行目以降)
String.split()
String.split() は、セパレーター(区切り)を使って、データを String[] に変換します。
String[] data = String.split(セパレーター);
CSV形式であれば、セパレーターを , に指定します。
String[] data = String.split(",");
繰り返し読み込み
while文を使ってファイルを1行ずつ読み込み、行末まで繰り返します。
item.ItemType.java
public void loadCsv() {
FileInputStream file;
InputStreamReader reader;
BufferedReader buffer;
try {
file = new FileInputStream(CSV_PATH);
reader = new InputStreamReader(file, "UTF-8");
buffer = new BufferedReader(reader);
String line = buffer.readLine();
// 行末まで繰り返し
while ((line = buffer.readLine()) != null) {
// ファイルを1行ずつ読み込み
String[] data = line.split(",");
System.out.println(data[0]);
}
} catch (Exception e) {
System.out.println(CSV_PATH + "が読み込めませんでした");
} finally {
}
}
CSVファイルの1列目(index = 0)のデータが繰り返し表示されました。
結果
1
2
3
4
5
7
Itemデータの作成
CSVデータを、Itemクラスのデータに変換します。このとき、CSVデータはString型なので、データ型にあわせて設定が必要です。
item.ItemType.java
public void loadCsv() {
FileInputStream file;
InputStreamReader reader;
BufferedReader buffer;
try {
file = new FileInputStream(CSV_PATH);
reader = new InputStreamReader(file, "UTF-8");
buffer = new BufferedReader(reader);
String line = buffer.readLine();
System.out.println(line);
while ((line = buffer.readLine()) != null) {
String[] data = line.split(",");
Long id = Long.parseLong(data[0]);
String name = data[1];
ItemType type = ItemType.valueOf(data[3].toUpperCase());
Integer price = Integer.parseInt(data[3]);
Integer attackPower = Integer.parseInt(data[4]);
Integer defencePower = Integer.parseInt(data[5]);
Item item = new Item(id, name, type, price, attackPower, defencePower);
list.add(item);
map.put(id, item);
}
} catch (FileNotFoundException e) {
System.out.println(CSV_PATH + "が読み込めませんでした");
} catch (IOException e) {
System.out.println("データエラー");
} catch (Exception e) {
System.out.println("予期せぬエラー");
}
}