今回はJavaを使ってCSVファイルの読み込みをしてみます。
今回はスタンドアロンのJavaプロジェクトを使って、作成したCSVファイルを読み込んでコンソールに内容を出力するという単純な処理を行います。
今回やりたいこと
今回は読み込むCSVファイル名を固定で指定し、ファイルを読み込み、コンソールで出力します。
プログラム起動時に実行されるmainメソッド内にファイルを読み込む処理を書かずに、別途ファイルを読み込んで配列を作るクラスとメソッドを作成し、その処理結果をmainメソッドに戻して、コンソール表示のための処理を行います。
用意するソース
用意するソースは以下の3つです。
1.main.java
プログラム起動時に実行するmainメソッドが書かれたソースファイルです。
内容は以下のように記述しています。
package article;
import java.util.List;
public class main {
public static void main(String[] args) {
fileRead fr = new fileRead();
// TODO 自動生成されたメソッド・スタブ
//ファイルを読み込む
List<String> readedData = fr.readCSV();
//エラーがあればここで終わり
if(readedData == null) return;
//エラーがなければデータを加工する
for(int i = 0 ; i < readedData.size() ; i++) {
//まずはカンマで区切って文字列を分割する
String strData = readedData.get(i);
String[] strDataList = strData.split(",");
//カンマ区切りで分割し手出来た配列に対して、1つずつコンソールに出力する
for(int j = 0 ; j < strDataList.length ; j++) {
//カンマ区切りを行っても""で囲んでいる部分が残っているので取り除く
String printoutStr = strDataList[j].replaceAll("\"", "");
//""を取り除いたデータをコンソールに出力する
System.out.println(printoutStr);
}
//改行されたデータは改行されたことが分かるようにコンソール出力に空の行を出力する
System.out.println("");
}
}
}
7行目でCSVファイルを読み込むクラスをnewで作成し、10行目でクラス内に存在するCSVを読み込んで行単位で文字列を返すメソッドを実行します。
今回はダブルクオーテーション付きのデータを扱いますので、ファイルから読み込む→各行ごとにカンマで区切って配列に入れる→配列に入れたデータのダブルクオーテーションを削除するという流れで実装しています。
また、異なる行のデータの出力を行う場合は、間に改行を1つ入れることで異なる行のデータであることが分かるような作りにしてみました。
2.fileRead.java
このファイルではファイルを読み込んで行ごとに配列にデータを入れて返すfileReadクラスの定義とその動作を実装しているreadCSVメソッドの定義を行っています。
package article;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
public class fileRead {
//CSVを読み込み、読み込んだ結果を返す
public List<String> readCSV() {
//読み込むファイルを指定(説明のため固定で指定)
Path path = FileSystems.getDefault().getPath("", "fruits.csv");
try {
//ファイルを読み込む
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
//読み込んだデータを返す
return lines;
}
catch (Exception e){
//エラーがあればnullで返す
e.printStackTrace();
return null;
}
}
}
14行目でファイルのパスを設定し、17行目で配列に読み込んだファイルの中身を1行単位で格納しています。
readCSVメソッドを実行した時点では、CSVの1行分のデータを文字列として扱い、ただ配列に格納しているだけそれ以上のことは行っていません。
なお、JavaでCSVを読み込む方法は他にもありますが、今回はFiles.readAllLinesを使うとファイル読み込みが出来るということを理解しておけば大丈夫です。
実際にファイルのパスを設定する時は変数などを使って指定することが多いかと思いますが、今回は説明のため固定値を入れてファイルをしていています。
3.fruits.csv
今回読み込む対象のCSVファイルです。
"サクランボ","イチゴ","ブドウ","デコポン","カキ"
"リンゴ","ナシ","パイナップル","メロン","スイカ"
どこかで見たことのある果物名が並んでいますが、それはいったん置いておきましょう。
このファイルは作成したプロジェクトのフォルダ内に配置しています。
実行結果
上記の3つのソースが準備出来たら、実際に動かしてみます。
すると、コンソールに以下のような内容が出力されました。
この出力内容は、fruits.csvに書かれているフルーツの順番通りに出力がされており、CSVファイルの改行が入ると、改行を1つ入れて別の行のデータが始まることもきちんと実現できています。
また、ダブルクオーテーションやカンマも含んでおらず、きちんと果物名だけを拾っているため、正常な動作をしたということが分かります。
まとめ
今回はCSVファイルを読み込んで内容をコンソールに出力する処理をJavaを使って実践してみました。
CSVファイルの読み込みは実際の仕事で使う頻度が多いのですが、今回紹介した以外にもいろいろな方法があると思います。
また、本来であればmain関数に余計なものをあまり書きたくないので、読み込んだ行を処理する部分もfileRead.javaに入れ込んであげると、よりいいプログラムになると思います。
おそらく、この記事を見に来られた方はJavaでCSVを読み込むにはどうしたらいいかを調べに来られている方が多いと思いますが、もし余裕があれば今回紹介したプログラムを書き換えてmainメソッドからは他のクラスのメソッドの呼び出しのみにし、他のクラスでどう処理したらいいのかを考えて見て欲しいと思います。
そこまで難しくないのでプログラミングの知識があればきちんとした書き方になるのではないかと思います。
今回の記事はここまでとなります。
また次の記事でお会いしましょう。