[Java] CSVファイルの読み込み方法
こんにちは、kei0310です。
CSVファイルをJavaに取り込む方法を解説します。
とはいっても、普通にファイルを開いてカンマ区切りでListに格納するだけですので、
テンプレートみたいに扱っていただく感じになるかと思います。
今回はいきなりプログラムから。
●CSVReaderクラス
package test.csv;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* CSVファイルを読み込むクラス
* @author kei0310
*
*/
public class CSVReader {
private String fileName;
private Integer num;
/**
* コンストラクタ
* @param fileName ファイル名
* @param num 読み込み行数(0の場合全量読み込み)
*/
public CSVReader(String fileName, int num){
// フィールド設定
this.fileName = fileName;
this.num = num;
}
/**
* CSVファイルの読み込みを実行する
* @return
*/
public List<List<String>> read() {
// 入力チェック
if(this.fileName == null || this.num == null){
return null;
}
// 返却用リスト箱作成
List<List<String>> ret = new ArrayList<List<String>>();
File csv = new File(fileName); // CSVデータファイル
BufferedReader br = null;
try {
// ファイルオープン
br = new BufferedReader(new FileReader(csv));
// num行読み込む(0の場合は全行)
String line = "";
int idx = 0;
while ((line = br.readLine()) != null) {
// 1行を格納する箱作成
List<String> tmpList = new ArrayList<String>();
// 文字列index
int idxFrom = 0;
int idxTo = 0;
// 文字列長
while (true){
// 最終項目を取得後は終了
if(idxFrom > line.length()){
break;
}
// 次のセパレータ位置を取得
idxTo = line.indexOf(",", idxFrom);
// セパレータが発見できない場合は最終項目を取得
if( idxTo == -1 ){
idxTo = line.length();
}
// 文字列取得
String word = line.substring(idxFrom, idxTo);
// 文字列を格納
tmpList.add(word);
// 検索開始位置を更新
idxFrom = idxTo + 1;
}
// 返却用リストに1行データを格納
ret.add(tmpList);
// カウンタ
if(idx % 1000 == 0){
System.out.println("入力: " + idx + " 件");
}
idx++;
// numを超えたら読み込み終了。numが0のときは全量読む。
if( num != 0 && idx > num ){
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
}
●使い方
// CSVファイル読み込み
CSVReader reader = new CSVReader(FILE_PATH + INPUT_FILE_NAME, 0);
// CSVデータ取得
List<List<String>> csv = reader.read();
●解説
処理は至って簡単。
概要だけ抽出すると、以下な感じです。
①2次元配列(List<List>)を作成
②ファイルオープン
③1行読み込み
④読み込んだ1行をカンマ区切りにカットして配列(List)に突っ込む
⑤作成した配列を返却用外側配列(List<List>)に突っ込む
うしろのエラー処理はおまじないです。
うちのPCで実行しても、100万件のデータを数秒で読み込むので、
csvを読み込むのにカンマ区切りしかしてないことを鑑みても
Javaもかなり高速になったなーと思った今日この頃でした。
スポンサードリンク
関連記事
-
[Java] 日付の計算方法(DateFormat、Date、Calendar)
こんにちは、kei0310です。 Javaで日付を計算する方法について解説します。 まず
-
[Java][Framework] Spring BootのJPAでDB接続した際のEntityキャッシュのクリア方法
Spring BootのJPAでDBアクセスした際に、処理を一定量こなすと、Heapが足りなくな
-
[Java][MySQL] JavaからMySQLを使う方法
MySQLは、フリーでありながら商用としても使用できるパワーを持つデータベース(RDB)です。
-
[Java][JSP] EclipseでのJSP作成
今回は、Eclipseを用いてJSPを作成してみます。 まず、Eclipseを起動します。
-
[Java][Servlet][JSP] ServletからJSPへの転送
こんにちは。 今回は、「Servletでリクエストを受けて、JSPで表示する。」方法を解説しま
-
[Java][Spring] DIする方式を細かく見てみる① @ScopeでのSingletonとPrototypeの指定
今回は@Scopeアノテーションを用いて、オブジェクトをDIする方式を選択してみます。 ●解説
-
[Java][基本] ループ処理(for文)
Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化];
-
[Java][基本] mainメソッドの書き方
こんにちはkeiです。 Javaの基本として、意外と知らないmain関数について解説します。
-
[java] 文字列の一部を切り取る方法(substring)
こんにちは。 今回は文字列の一部を切り取る方法について解説します。 具体的には、String
-
[Java][Spring] Spring3でDIしてみる!(アノテーション使用)
Spring3を使って、一番基本的な形のプログラムを作成してみます。 今回は、アノテーションを