CSVファイルの特定の行を効率よく読み込む方法はあるのか?

このQ&Aのポイント
  • CSVファイルの特定の行を読み込む方法について効率的な方法を知りたい。
  • 現在はループを使用して1行ずつ読み込んでいるが、行番号を指定して直接読み込む方法はないか?
  • Javaの標準クラスで効率的にCSVファイルの特定の行を読み込む方法があるか知りたい。
回答を見る
  • ベストアンサー

CSVファイルの特定の行だけを読み込みたいです。

例えば以下のようなCSV形式のデータが10000行あるとします。  1,10,15,3  2,1,5,1  70,2,4,2  2,4,5,6  11,1,9,9  ・・・ 上記ファイルから、例えば9999行目を取得したい場合、 現在は以下のような手順で9998行をループで読み込んでから、 9999行目を取得しています。(エラー処理などは省いています)  BufferedReader br = new BufferedReader(new FileReader("hoge.csv"));  for( int i=0; i<9998; i++ ){ br.readLine(); }  System.out.println("9999行目="+br.readLine()); ただし、上記の通りループを9998回まわし、 データを1行ずつ読み込むのは非常に効率が悪いです。 できれば、br.readLine(9999); といった感じで行数を直接指定できる方法があるならば、 無駄な処理を省けて見栄えも速度も良くなると思うのですが、 Javaの標準のクラスではこういったことは可能なのでしょうか? 私なりに調べてみたのですが調べ方が悪いのか知識が及ばないため、 こちらで質問させていただきました。 もしご存知の方がおられましたらアドバイスいただけますと助かります。 よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yukitakao
  • ベストアンサー率44% (16/36)
回答No.2

Javaはしばらくいじってないのであれですが・・・ 仮にreadline(9999)というような関数があるとしても内部的には for(int i=0;i<9998);i++){ br.readline() } と同じことをしていて スペック的にはほとんど変わらないはずです。 9999行目を読み込むためには 1行目から順に最初からファイルを読んでいって改行の数を数えてやる必要があるので・・・ 見栄えがというのであれば自分でBufferedReader を継承して独自のクラスを作ってしまったらいかがでしょう? readline(int line)だけ書いてやるだけだから5分とかからないし・・・ なおJavaは最近いじってないので標準関数でご希望のものがあるかはわかりませんが 自分だったらそんなことで悩んでる暇があったら自分で書いちゃいます。

hiroko_ss
質問者

お礼

改行コードがいくつ入ってるかを調べないと駄目ということは、 あまり速度的にも改善は見込めなさそうですね。 見栄えよりも出来れば速度的に改善したかったので、 改善しようと思ったらデータの形式自体を変えないと無理でしょうか…。 ご回答ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「各行の長さが一定である」などの条件がない限り, 本質的にはどうしようもありません. ほかの人も書かれていますが, 「見栄え」はきれいになっても効率は変わらないです.

hiroko_ss
質問者

お礼

見栄えよりも出来れば速度的に改善したかったので、 他の方も仰るとおりデータの形式自体を変えないと無理みたいですね…。 でもこれでモヤモヤが取れました。 ご回答ありがとうございました。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

JAVAを全く知らない私が言うのもなんですが、 特定の行ということは、改行コードがいくつ入っているということを読んで調べないと どこから始まっているのかわからないとおもいます。(のでむりだとおもいます。)

hiroko_ss
質問者

お礼

うーんなるほど。 改行コードがいくつ入ってるかを調べないと駄目ということは、 あまり速度的にも改善は見込めなさそうですね。 ご回答ありがとうございました。

関連するQ&A

  • CSVファイルの、列だけ取得したい

    FileReader filereader = new FileReader(FileName); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 0; while((line = bufferedreader.readLine()) != null) { int j = 0; StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { item[j][i]=stringTokenizerTest.nextToken().toString(); j++; } i++; } filereader.close(); このような記述で、CSVの中身を全て取得することは出来るのですが、 ある一列だけ取得する方法がわかりません。 具体的には、コンボボックスにCSVのある一列だけ表示させたいです。 (その後、重複なしの値のみにフィルタリングしたい) 現在は苦し紛れに、 combo1.setModel(new DefaultComboBoxModel(new String[] { item[1][3], item[1][4], item[1][5], item[1][6], item[1][7], item[1][8], item[1][9], })); などと、配列を使ってピンポイントで値を取得していますが これでは使えないので・・ アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • CSVファイルを二次元配列に格納するプログラム

    前回のソースコードを改変してみました String Str = ""; int Count = 0; try { File inFile = new File("./res/test.csv"); FileReader fr = new FileReader(inFile); BufferedReader br = new BufferedReader(fr); while (br.ready()) { Str = br.readLine(); String[] temp = Str.split(","); int[] m = new int[temp.length]; for (int i = 0; i < temp.length; i++) { m[i] = Integer.parseInt(temp[i]); System.out.print(m[i] + ","); } System.out.println(); Count++; } br.close(); fr.close(); } catch (Exception e) { System.out.println("ファイル読み込みに関するエラー"); } 今一次元配列になっているのですが、これを二次元配列に代入したいのです Countで何回ループしたかによって二次元配列の縦の要素数としたかったのですが、 そうすると横の要素数になるループ中の一次元配列が使えないので困っています

  • CSVファイルを二次元配列に格納するプログラム

    整数のCSVファイルを読み込んで、int型の二次元配列に格納するプログラムを作成中なのですが どうもうまくいきません。 String Str = ""; try { File inFile = new File("./res/test.csv"); FileReader fr = new FileReader(inFile); BufferedReader br = new BufferedReader(fr); ArrayList<String[]> al = new ArrayList<String[]>(); while (br.ready()) { Str = br.readLine(); al.add(Str.split(",")); } int[][] im = new int[al.size()][]; for (int i = 0; i < al.size(); i++) { im[i] = (int)al.get(i); // ここでエラー } br.close(); fr.close(); } catch (Exception e) { System.out.println("ファイル読み込みに関するエラー"); } 他にいい方法ありませんか? また逆で、int型配列に格納されているデータをCSVファイルとして出力する方法もお願いします

  • CSV読み込み 文字化け

    失礼いたします。 以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。 分かる方、よろしくお願いします。 -------------------ソースはここから import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; // import java.io.FileReader; FileReaderからInputStreamReaderに変更済み import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class ReadCSV { public static void main(String[] args) { try { File csv = new File("C:\\AP.csv"); // BufferedReader br = new BufferedReader(new FileReader(csv)); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"EUC_JP")); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"MS932")); while (br.ready()) { String line = br.readLine(); StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { System.out.print(st.nextToken() + "\t"); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { キャッチ処理 }

    • ベストアンサー
    • Java
  • CSVファイルから特定の文字列を含む行を出力

    CSVファイルを読み込み、特定の文字列を含む行を出力するプログラムを作成しています。 出力メソッドを作り、呼び出したいのですがうまくいきません。 コンパイルは通りますが出力したファイルには何も書き込まれていない状況です。 ヒントだけでも頂けると幸いです。 よろしくお願いします。 import java.io.*; import java.util.*; public class Test{ static String[] data; static BufferedWriter writer = null; public static void main(String[] args) throws Exception { String line; BufferedReader reader = null; reader = new BufferedReader(new FileReader("Week.csv")); writer = new BufferedWriter(new FileWriter("New.csv")); while (reader.ready()) { line = reader.readLine(); if (line.contains("氏名")) { create(line); } else if (line.contains("月")) { create(line); } else if (line.contains("水")) { create(line); } else if (line.contains("金")) { create(line); } } } //メソッド static void create(String line) throws Exception { data = line.split(","); for (int i = 0; i < data.length; i++) { writer.print(data[i]); writer.println(); } } }

    • ベストアンサー
    • Java
  • Servletでcsvファイル読込

    Servletからcsvファイルを読込む処理を作成しています。 しかし、FileNotFoundExceptionが発生してファイルを読込めません。 下記のように記述した場合、csvファイルはどこに置けばよいのでしょうか? いろいろファイルの置き場所を変えてはやってみましたがダメでした。 package action; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class MemberEntryAction extends Action{ public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { try { // 入力ストリームを作成。 FileReader fr = new FileReader("a.csv"); BufferedReader br = new BufferedReader(fr); // 読込みループ。 String line; // 読み込まれた1行。 while( (line = br.readLine()) != null ) { System.out.println(line); } // 入力・出力ストリームを閉じる。 br.close(); fr.close(); } catch ( FileNotFoundException e ) { System.out.println("FileNotFound!"); } return mapping.findForward("memberMenu"); } }

  • javaで大量のファイルを読み込む方法

    javaプログラミングについて質問です。 例えば、a1.txt~a100.txtの100個のテキストファイルがある として、これをループか何かを使って順番に読み込みたいのですが、 そのような方法はあるのでしょうか。 // ファイル入力ストリームを取得 BufferedReader br = new BufferedReader(new FileReader("a1.txt")); BufferedReader br2 = new BufferedReader(new FileReader("a2.txt")); BufferedReader br3 = new BufferedReader(new FileReader("a3.txt")); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ BufferedReader br100 = new BufferedReader(new FileReader("a100.txt")); という風に書くのが面倒に思っています。 宜しくお願いします。

    • ベストアンサー
    • Java
  • CSVデータの読み込みについて

    大変お世話になっております。 CSVデータを読み込みたいのですが、 以下のようになってしまいます。 ----test.csv----- 1,a2,a3 2,a2,a3 3,a2,a3 4,a2,a3 5,a2,a3 6,a2,a3 7,a2,a3 8,a2,a3 9,a2,a3 10,a2,a3 ----------------- //FileReaderでもFileでも結果は同じ // FileReader t_in = new FileReader("test.csv"); File t_in = new File("test.csv"); BufferedReader in = new BufferedReader(new FileReader(t_in)); while (in.ready()) { String line = in.readLine(); System.out.println("lineは " + (line = in.readLine()) + " です。"); } ---------表示結果--------- lineは 2,a2,a3 です。 lineは 4,a2,a3 です。 lineは 6,a2,a3 です。 lineは 8,a2,a3 です。 lineは 10,a2,a3 です。 ------------------------- 1,3,5,7,9はなぜ読み込んでくれないのでしょうか? ご存知の方、いらっしゃったら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • CSVファイルを , で句切って出力する

    同じ質問になってしまってすみません。 困り度を2ではなく3にしたかったので再掲示してしまいました。 よろしくお願いいたします。 次のような課題が出たのですが教えていただきたく書き込みしました。 皆様のお力をお貸しください。 (1)適当なフォルダにファイルを用意する(ファイルにはCSV形式で文字列が書いてある) (2)最初に文字列をキーボードから入力させる(文字列は半角で5文字まで、それ以外ならば繰り返し入力させる) ※ 指定したファイルがない場合は堤外を出力(try,catch) (3)フォルダのファイル読み込み、(2)で入力した文字列が含まれているCSVのカラムをファイルに出力(ファイルは新規作成 public class Match { public boolean matchString (String[] args) { // マッチング対象の文字列です。 String str = "​http://iwamode.net/index.html";//​ Pattern p = Pattern.compile("^https?://"); // 正規表現のコンパイル Matcher m = p.matcher(str); // 正規表現エンジンの生成 if (m.find()) { // java.util.regex.Matcher#find()メソッドは部分一致するかを判断します。 System.out.println("「http://」または「https://」から始まる文字列です。"); } else { System.out.println("「http://」または「https://」から始まる文字列ではありません。"); } Pattern p2 = Pattern.compile("\\.com"); Matcher m2 = p2.matcher(str); if (m2.find()) { return true; } return false; } } ----------------------------------------------------------- try{ File csv = new File("Kadai10.csv"); // CSVデータファイル BufferedReader br = new BufferedReader(new FileReader(csv)); // 最終行まで読み込む while (br.ready()) { String line = br.readLine(); // 1行をデータの要素に分割 StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { // 1行の各要素を区切りで表示 System.out.println(st.nextToken() + ","); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { // Fileオブジェクト生成時の例外捕捉 e.printStackTrace(); } catch (IOException e) { // BufferedReaderオブジェクトのクローズ時の例外捕捉 e.printStackTrace(); } -------------------------------------------------------------- System.out.println("半角5文字までの文字列を入力してください"); BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String str = r.readLine(); if(str.length() <= 5 && str.matches("[0-9a-zA-Z]")) { 上記の3つの部分ソースを使いプログラムを完成させたいんですがどのようにしたらいいでしょうか?

    • ベストアンサー
    • Java
  • ファイルの読み込み

    "DataFile"に何行か文字列がはいっており、下のソースでそれをテキストボックスにすべて出力したいのですが、1行しか読まれません。 やり方を教えてください。 String moji = null; FileRead(){   try {     BufferedReader br = new BufferedReader( new FileReader( "DataFile.txt" ) );     while ((moji = br.readLine()) != null){       taList.setText(moji);     }     br.close();   }   catch ( Exception e ) {     System.out.println( e.getMessage() );   } }

    • ベストアンサー
    • Java

専門家に質問してみよう