[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][JSP] EclipseでのJSP作成今回は、Eclipseを用いてJSPを作成してみます。 まず、Eclipseを起動します。 
-  
                              
- 
              [Java] Javaのインストール(プログラム開発・入門用)Javaのコードを書きたい!! という目的のためのJavaのインストール方法と、コマンドラインでの 
-  
                              
- 
              [Java] 文字列の分割(split)こんにちは。 今回は、文字列の分割について解説します。 昔はStringTokenize 
-  
                              
- 
              [Java][基本] ループ処理(for文)Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化]; 
-  
                              
- 
              [Java][Eclipse] Mavenが利用可能な動的Webプロジェクトの作成こんにちは、keiです。 今回は、Mavenが利用可能な動的Webプロジェクトの作成について解 
-  
                              
- 
              [Java][Servlet][JSP] ServletからJSPへの転送こんにちは。 今回は、「Servletでリクエストを受けて、JSPで表示する。」方法を解説しま 
-  
                              
- 
              [Java] クラスとインスタンスこんにちは。 クラスとインスタンスについて解説します。 インスタンスは「オブジェクト」とも言 
-  
                              
- 
              [Java][基本] mainメソッドの書き方こんにちはkeiです。 Javaの基本として、意外と知らないmain関数について解説します。 
-  
                              
- 
              [Java][Framework] Spring Bootを使って、Spring MVC速攻開発してみる!(DB接続あり)STSインストール STSは、EclipseにSpring関連のいろいろな機能を詰め込んだオールイ 
-  
                              
- 
              [Java][Jersey] JerseyでRESTfulなJAX-RS Webサービス作成こんにちは、keiです。 今回はRESTfulなWeb Serviceの作成を行っていきます。 


