CSVファイルをJavaで読み込んで文字コードを変換
はじめに
CSVファイルのデータをSQLに取り込みたい! といった場合に役立ちます。 今回は、SJIS(Shift-JIS)のデータをUTF-8に変換してからカンマ区切りで配列にして、最後に標準出力で確認します。
使用するCSVデータ
no,title,year 1,てすと,2011 2,テスト,2012 3,test, 4,TEST,2015
コード
public class TestClass { public static void main(String[] args) { try { File file = new File("/usr/local/test.csv"); FileInputStream input = new FileInputStream(file); InputStreamReader stream = new InputStreamReader(input,"SJIS"); BufferedReader buffer = new BufferedReader(stream); String line; while ((line = buffer.readLine()) != null) { byte[] b = line.getBytes(); line = new String(b, "UTF-8"); String[] columns = line.split(",",-1); for (int j = 0; j < columns.length; j++) { System.out.println(j + " : " + columns[j]); } System.out.println(""); } input.close(); stream.close(); buffer.close(); } catch (UnsupportedEncodingException | FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
出力結果
行ごとに配列をわけ、その要素の0~2番目を表示しています。
0 : no 1 : title 2 : year 0 : 1 1 : てすと 2 : 2011 0 : 2 1 : テスト 2 : 2012 0 : 3 1 : test 2 : 0 : 4 1 : TEST 2 : 2015
解説
ファイルのパスを指定してオブジェクトを生成。
File file = new File("読み込みたいファイルのパス");
入力ストリームを生成。 ( FileNotFoundException が発生 )
FileInputStream input = new FileInputStream(file);
入力ストリームの読み込み。 ( UnsupportedEncodingException が発生 ) ここでCSVファイルの文字コードを設定しないと文字化けします。
InputStreamReader stream = new InputStreamReader(input,"読み込むファイルの文字コード");
バッファに取り込み。
BufferedReader buffer = new BufferedReader(stream);
readLine()でバッファの1行を取り出す作業を、読み込める行が無くなるまでwhile文で実行。 line = buffer.readline() でBufferedReaderが保持する一行を取出しているので、ループする毎に書き変わります。
while ((line = buffer.readLine()) != null) {
取出した1行の文字セットを変換して新たに文字列を生成。( String で UnsupportedEncodingException が発生 )
byte[] b = line.getBytes(); line = new String(b,"変換したい文字コード");
文字列をカンマ区切りで配列に分けて要素ごとに出力。 16行目、line.splitの第2引数に"-1"を指定しないと、" 3,test, " の行の配列は " 3,test " の2つになってしまい他の行と要素数が違うため、出力結果の様にはなりません。
String[] columns = line.split(",", -1); for (int j = 0; j < columns.length; j++) { System.out.println(j + " : " + columns[j]); }
開いたストリームとバッファを閉じて関連するシステム・リソースを解放します。 ( IOException が発生 )
input.close(); stream.close(); buffer.close();
まとめ
タイトルの課題を進めようとしたときにググったのですが、コードが古かったり、ピンポイントでまとまってなかったりしたので、自分がその時に欲しかった内容を記事にしました。 今後は、データベースに登録するまでを書く予定です。