JavaプログラムでCSVファイルを読み込む処理は、業務系のシステムを作っているプログラマーをはじめとして意外と触れる機会の多いものです。
本記事では、JavaでCSVファイルを読み込む方法をなるべく簡単にご紹介していきたいと思います。
JavaでCSVファイルを読み込む方法
JavaでCSVファイルを読み込む際に利用されるのが「FileInputStream」クラスです。
または「FileReader」クラスを用いてCSVの読み込みを行うことも可能です。
基本的にはテキストファイルと同じようにcsvファイルを読み込んだ後に、カンマ部分で分割してデータの取得を行います。
本記事では、比較的初心者にも分かりやすく効率も良い、ストリーム形式で読み込む「FileInputStream」を紹介したいと思います。
JavaのFileInputStreamでCSVファイルを読み込んでみよう
Javaから提供されている「FileInputStream」クラスを利用してCSVファイルの読み込み処理を行う方法を、サンプルコードを交えながらご紹介していきたいと思います。
CSVファイルを用意する
まず今回Javaプログラムで読み込むようのサンプルCSVファイルを用意します。
「sample1.csv」というファイル名で内容は下記の通りとなります。
name,age,address test1,20,Tokyo test2,30,Osaka test3,40,Okinawa
1行目にそれぞれのカンマ毎のカテゴリとして「名前(name)」「年齢(age)」「住所(address)」を設定し、2行目以降に各ユーザー情報を持ったcsvファイルを想定したサンプルです。
メインとなるJavaファイルを作成する
次にメインとなるJavaファイルの内容が下記の通りとなります。
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { // BufferedReaderはtry処理の最後に必ずclose処理を入れる必要があるため、最初に初期化処理を行っています BufferedReader buffReader = null; try { // sample1.csvファイルを読み込みます FileInputStream fileInput = new FileInputStream("sample1.csv"); // ※1 // バイトストリームをテキスト形式に変換 InputStreamReader inputStream = new InputStreamReader(fileInput); // ※2 // テキスト形式のファイルを読み込む buffReader = new BufferedReader(inputStream); // ※3 String currentContent; int row = 0; String[] arrayColumnName = null; while((currentContent = buffReader.readLine()) != null) { // ※4 System.out.println(row + "行目のデータ"); if(row == 0) { // ※5 arrayColumnName = currentContent.split(","); } else { int arrayNumber = 0; String[] arrayColumnData = currentContent.split(","); // ※6 for(String columnName : arrayColumnName) { ※7 // カラム名と該当行のデータをコンソール出力 System.out.println(columnName + " = " + arrayColumnData[arrayNumber]); ※8 arrayNumber++; } } row++; } } catch(Exception ex) { ex.printStackTrace(); } finally { try{ buffReader.close(); ※9 } catch(Exception ex) { ex.printStackTrace(); } } } }
処理の流れを大まかに説明しておきます。
ソースコード上のコメントと合わせて、どの行でなんの処理が行われているのか把握しておきましょう。
CSVファイルの読み込み
まず※1の行で、「FileInputStream」を利用して「sample1.csv」ファイルを読み込みます。
この時点ではテキストファイルとして認識出来ないため、※2の行で「InputStreamReader」を用いてテキスト形式に変換します。
次に変換したテキストファイルを※3の行で「BufferedReader」を用いてまとめて読み込んでいます。
ファイルの内容を1行ずつ抽出する
「BufferedReader」クラスには「readLine」メソッドが提供されており、1行ずつテキストファイルを処理していくことが可能となっています。
※4の行では上述した「readLine」メソッドを用いて、1行のデータを変数「currentContent」に格納しています。
ファイルが終わりに達している場合には、「null」が変数に格納されるため、「while」文を利用しファイルの終わりまで中身のデータを出力する処理を記述しています。
※5の行では、読み込んだ行が最初の行かどうかを判定しています。
通常、CSVファイルで定義されているデータは1行目にカラム名を指定し、2行目から実際のデータが入力されているケースがほとんどです。
サンプルのCSVファイルを見ていただいても同様に1行目がカラム名の定義、2行目以降から実際のデータが設定されていることをご確認頂けます。
抽出した1行のデータを加工して処理を実施する
※6の行では、抽出した1行のデータを更にカンマで区切り配列データとして変数「arrayColumnData」に格納しています。
※7の行で先頭行のカラム名の回数分ループ処理を行い、※8の行で「カラム名 = 該当行のデータ」として出力する処理を記述しています。
さいごに:JavaでCSVファイルの読み込みは簡単に行える
本記事では、JavaプログラムでのCSVファイルの読み込み方について、なるべく簡単に行える方法でご紹介してきました。
Javaからは今回ご紹介したように「FileInputStream」や「BufferedReader」など便利なクラスが提供されているため、一見難しそうに思えるCSVファイルの読み込みもサンプルのように比較的簡単に行えます。
何かと利用する機会も多いCSVファイルとの連携処理ですので、ぜひ一度ご自身でサンプルコードを編集しながら理解を深めてみてください。
※9で行なっているBufferedReaderインスタンスのclose処理はエラーが起きても起きなくても必ず実行する必要があるので、Finally句の中で宣言しています。