はじめに
押忍!
今日は業務用アプリとかでよく見る
CSVデータをアップロードしてDBに登録する機能をSpringを使って作成してみました!
そもそもCSVってなんぞ
私は業界に入るまで見たことも触ったこともなかったんで一応記載しておきます。
Comma Separated Valuesの略称で
従業員番号,氏名,部署
A123456789,総務太郎,総務部
B223456789,営業花子,営業部
こんな感じでカンマごとに値を区切ったデータの事です。
ファイル形式は .csv になります。
ちなみに1行目は項目名を記載したヘッダーレコードなのですが、
物によってあったりなかったりします。
今回はある想定で作成をしたので
DBに登録するのは2行目以降ってことですね。
やりたいこと
画面からCSVを選択してアップロード
アップロードされたCSVの内容をDBに登録
作ってみた
まずは画面から
csvに下記のフォームを追加します。
<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<button type="submit">アップロード</button>
</form>
・form 中の enctype="multipart/form-data"ですが
WEBアプリでファイル送信をする際に、
一般的に使用されるデータ送信フォーマットだそうです。
細かいところまで調べるとそれだけで記事が書けそうなので今回はここまで!
・あとはinput type="file"
にすることで勝手にそれっぽくしてくれます。
次にJava側で送信されたCSVを受け取り、DBに登録する処理を追記します。
@PostMapping(path = "/upload")
public String upload(@RequestParam("file") MultipartFile file) {
try (InputStream inputStream = file.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
//読み取ったCSVの行を入れるための変数を作成
String line;
//ヘッダーレコードを飛ばすためにあらかじめ1行だけ読み取っておく(ない場合は不要)
line = br.readLine();
//行がNULL(CSVの値がなくなる)になるまで処理を繰り返す
while ((line = br.readLine()) != null) {
//Stringのsplitメソッドを使用してカンマごとに分割して配列にいれる
String[] csvSplit = line.split(",");
//分割したのをセットして登録
Entity entity = new Entity();
entity.setAAAA(csvSplit[0]);
entity.setBBBB(csvSplit[1]);
entity.setCCCC(csvSplit[2]);
entity.setDDDD(csvSplit[3]);
Repository.save(entity);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return "view";
}
今回はControlerの中に処理を記載しましたが
本来であればServiceとかで作成して呼び出すのが正しいかと思います!
あと例外処理(CSV以外のファイルが送信された、CSVの項目数が違う etc)については今回は放っておきます
まとめ
上記のコードで実行したところ一応CSVの内容をDBに登録する事が出来ました!
あとは状況に応じて例外処理とか実施すれば使えそうですね
とりあえずCSVを読みこむ時は
・1行ずつ読み込む
・カンマごとに分割する
のがポイントです!たぶん