[Java] CSVファイルの読み込み方法

公開日: : 最終更新日:2014/10/17 Java, 基本 , , ,

こんにちは、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もかなり高速になったなーと思った今日この頃でした。

スポンサードリンク

関連記事

no image

[Java][Framework] Spring Bootを使って、Spring MVC速攻開発してみる!(DB接続あり)

STSインストール STSは、EclipseにSpring関連のいろいろな機能を詰め込んだオールイ

記事を読む

no image

[Java][Servlet] EclipseでのJavaServlet作成

こんにちは、今回はEclipseを使用してJavaServletを作成します。 Eclipse

記事を読む

no image

[Java] 文字列の分割(split)

こんにちは。 今回は、文字列の分割について解説します。 昔はStringTokenize

記事を読む

no image

[Java][Eclipse] Mavenが利用可能な動的Webプロジェクトの作成

こんにちは、keiです。 今回は、Mavenが利用可能な動的Webプロジェクトの作成について解

記事を読む

no image

[Java] テキストファイルの読み込み方法

こんにちは、今回はテキストファイルをJavaで読む方法を紹介します。 標準で提供されているクラ

記事を読む

no image

[Java][基本] mainメソッドの書き方

こんにちはkeiです。 Javaの基本として、意外と知らないmain関数について解説します。

記事を読む

no image

[Java][Spring] Spring3でDIしてみる!(アノテーション使用)

Spring3を使って、一番基本的な形のプログラムを作成してみます。 今回は、アノテーションを

記事を読む

no image

[Java][基本] ループ処理(for文)

Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化];

記事を読む

no image

[java] 文字列の一部を切り取る方法(substring)

こんにちは。 今回は文字列の一部を切り取る方法について解説します。 具体的には、String

記事を読む

no image

[Java][Jersey] JerseyでRESTfulなJAX-RS Webサービス作成

こんにちは、keiです。 今回はRESTfulなWeb Serviceの作成を行っていきます。

記事を読む

スポンサードリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スポンサードリンク

no image
[python] 日付の取り扱い(datetime) 現在日付、計算、文字列変換(format)

現在日付 日付の計算 [crayon-59c6eec35c5a

no image
[python] 文字列結合

pythonでの文字列結合 サンプル

no image
[python] 配列の扱い方

pythonでの配列の扱い方 python 配列の作成

no image
[python] ファイルの読み込み

pythonでのファイルの読み込み方法 基本サンプル

no image
[PHP] 文字列の置換(str_replace)

文字列中の特定文字列を置換する方法 str_replace サ

→もっと見る

  • 2017年9月
    « 8月    
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
  • 2017年9月
    « 8月    
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
PAGE TOP ↑