• ベストアンサー

データファイルの読み込みについて

はじめまして 100MB、200万行程度のファイルを解析しようとしています。そこで詰まっている所なのですが、 例えば、100行まで読み込んで一旦ストリームを閉じ、他で解析し、次の読み込みで101行からデータを取り 出すといったような処理を実現できないでしょうか? 読み込みは、BufferedReaderのreadLine()で行って おります。BufferedReaderのmark()、reset()で 出来そうな気配もありますが、 なにぶん初心者なもので、全く的外れかもしれません。 どなたかご教授お願いします。

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

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.4

#1です。 >二つのストリームを開いているので、 片方を閉じないと、処理出来ないかなと 思うのです。 2つくらいなら、両方開いても問題ないと思いますが。。。 まだ説明不足の情報があるとか。。。

ikeko_01
質問者

補足

遅くなりました。ご回答ありがとうございます。 始めから、片方ずつ処理する方向で考えを進めていたので、 2つを開いたまま処理するというのには頭が回っていませんでした。 恥ずかしながら、説明不足と言うより勉強不足のようです。 頂いたご助言を元に勉強しなおして参ります。 ついでと言ってはなんですが、一つ質問させてください。 ストリームを開きすぎるとどのような問題が発生するのでしょうか? お時間がございましたら、教えて頂けると幸いです。

その他の回答 (4)

回答No.5

こんばんは。 >ストリームを開きすぎるとどのような問題が発生するのでしょうか? いろいろあるとは思いますが、メモリー不足で・・・なんて事になりそうです。 (^^ゞ

ikeko_01
質問者

お礼

素早いご回答ありがとうございます。 メモリ不足ですか…。 メモリ不足と言えば、OutOfMemoryErrorにはよく悩まされます(-_-;) まだまだ修行不足なもので。

  • covachan
  • ベストアンサー率38% (46/120)
回答No.3

DataInput系を使えばいいじゃないですか? そういった用途の為のクラスです。

ikeko_01
質問者

お礼

ご指摘ありがとうございます。 確かにBufferedReaderにこだわり過ぎかもしれません。 DataInput系を検討してみようと思います。

回答No.2

こんにちは。 閉じたら「mark」がなくなります・・・。 (^^ゞ

ikeko_01
質問者

お礼

そうなんですか。ありがとうございます。 markは使えませんね…。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

>一旦ストリームを閉じ、 閉じる必要があるのですか?

ikeko_01
質問者

補足

説明不足でした。 二つのストリームを開いているので、 片方を閉じないと、処理出来ないかなと 思うのです。 双方を開いたまま処理する方法があるのかも しれませんが…。どうでしょうか?

関連するQ&A

  • 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
  • javaの配列とファイル読み込みについて。

    javaでゲームを作っておりマップの読み込みでつまってしまったので 質問させてもらいます。 try { BufferedReader br = new BufferedReader( new InputStreamReader(getClass().getResourceAsStream(filename))); // rowを読み込む String line = br.readLine(); row = Integer.parseInt(line); // colを読む line = br.readLine(); col = Integer.parseInt(line); // マップサイズを設定 width = col * CS; height = row * CS; // マップを作成 map = new int[row][col]; for (int i=0; i<row; i++) { line = br.readLine(); for (int j=0; j<col; j++) { map[i][j] = Integer.parseInt(line.charAt(j) + ""); } } } catch (Exception e) { e.printStackTrace(); } これなんですがreadLine()は1行読み込むと見たんですが、 多分ファイルに改行がないために最初から最後まで読み込めたんじゃないかとおもいます。でもそのあとの配列へ入れるやり方がよくわかりません。どうなっているんでしょうか? よろしくお願いします。 ちなみに参考にさせてもらっているページは http://javagame.skr.jp/index.php?%A5%DE%A5%C3%A5%D7%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF です。

    • ベストアンサー
    • 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"); } }

  • ファイル内の1行(レコード)から指定バイト数だけを読込みたい。

    ファイル内の1行(レコード)から指定バイト数だけを読込みたい。 // ファイルオープン FileInputStream fis = new FileInputStream(file); InputStreamReader isr; isr = new InputStreamReader(fis); BufferedReader result = new BufferedReader(isr); while (result.readLine() != null) { // 末尾まで移動する } 上記のようにBufferedReaderを使い、ファイルを読み込んでいるのですが、 ファイル内の1行ごとに指定バイト数だけを読み込みたいです。 readLineメソッドでは1行を全部読み込んでしまうため出来ません。 (readLineで一度他の変数へ入れてからというのは無しです。読込む時点で指定バイト数としたいのです。) readメソッドでは、行ごとの指定って出来ないですよね・・・。 ファイル操作系の知識が少ない為、なかなか探せません。 読み込む時点で1行の取得レコード長に制限値を設ける方法はないでしょうか? また、取得レコード長が制限値を超えた場合、エラーメッセージを出したいのですがその判定とかも可能でしょうか? どうかよろしくお願いします。 ロジックとしてはこんな感じにしたいです。 while(ファイルの終端まで行を読み込む){   // 読み込んだ1行が2048バイト未満かを判定   if(読み込んだ1行が2048バイトを超えている場合){     エラーメッセージを出力する(処理はそのまま続行)   }   1行から2048バイト未満を取得 }

    • ベストアンサー
    • Java
  • javaで大きなファイルを解析できますか?

    100MBくらいのアクセスログをjavaを使って解析しようと思うのですが、どうしても、エラーが出ます。 読み込み方が間違っているのでしょうか? まったくわかりません。 教えていただけないでしょうか? また、これを知ったきっかけも教えていただけましたら幸いです。 宜しくお願い致します。 読み込みの部分↓↓↓ class kaiseki { public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("log.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is));

    • ベストアンサー
    • Java
  • ファイル出力時の

    以下のソースでファイル出力するのですが、 BufferedReader br = new BufferedReader(new FileReader(new File(args[0]))); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(args[1]))); //一行読み込みを行った文字列を格納 String line; //一行読み込み while((line = br.readLine()) != null){ //一行書き込み pw.write(line); System.out.println(line); } コンソールへの出力は正常に出力されるのですが、 ファイルへの出力は改行されずに一行で出力されてしまいます。 どうすればファイル出力も正常になるか教えてください。

  • C#のテキストファイル読み込みについて

    C#のテキストファイル読み込みについて 2次元配列を使います(a[行][列]みたいに テキストファイルを1文字ずつ読み込みます。 そして、改行文字が見つかると行を1つずらします それを繰り返して最後まで読みこむと終わり そんなことをしたいです DOBON.NETでこんなの見つけたんですが 上の処理をしようと思っても、どこをいじればできるのかわかりませんでした //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容を一行ずつ読み込む while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } //閉じる sr.Close(); よくわかるサイトとかあったら教えてください、お願いします

  • ネットワークプログラミングでの読み込みについて

    現在ネットワークプログラミングの勉強をしています。 クライアント側の標準入力で文字列入力→Enter押下→ サーバ側の標準出力でその文字列を出力 という処理を行いたいのですが、サーバ側の出力が表示されません。 まず具体的にソースを出した方が状況を説明しやすいので、提示致します。 ------------------------------- サーバ側 public static void main(String[] args)throws Exception ServerSocket ss=new ServerSocket(7777); while(true){ sock=ss.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(sock.getInputStream())); String str=br.readLine(); if(str.equals("end"))break; System.out.println(str); } sock.close(); ss.close(); br.close(); } ---------------------------------- クライアント側 public static void main(String[] args)throws Exception { Socket sock=new Socket(コンピュータ名,7777); while(true){ BufferedWriter bw=new BufferedWriter(new InputStreamReader(sock.getOutputStream())); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str=br.readLine(); bw.write(str); bw.flush(); if(str.equals("end"))break; } bw.close(); sock.close(); ---------------------------------- 自分で色々試したところバッファリングで入力された文字列を溜めたまま 吐き出していないのが原因のような気がするのですが、BufferedReader#readLineのドキュメントを見ると >1 行のテキストを読み込みます。1 行の終端は、改行 (「\n」) か、復帰 (「\r」)、または復行とそれに続く改行のどれかで認識されます。 とあるのでクライアント側のbw.write(str)の後にbw.newLine()を呼んだりstr+="\n" などを行ってみたところ、 サーバ側は最初の入力をすぐに出力し、その後のクライアントからの入力には無反応になりました。 このようになる原因と解決が分かる方居ましたら、教えてください。

    • ベストアンサー
    • Java
  • はじめまして。よろしくお願いいたします。

    はじめまして。よろしくお願いいたします。 java初心者です。 javaでファイルを読み込み、1行ずつ処理して別プログラムに出力するプログラムを作成しています。 ----サンプルソースコード import java.io.*; class testReader { public static void main(String[] args) { FileReader fr = new FileReader("test.txt"); BufferedReader br = new BufferedReader(fr); while (true) { String readLine = br.readLine(); : : ----サンプルソースコード 上記のような感じで処理を進めるのですが、1点問題にぶつかりました。 readLineで読み込んだ行にタブ文字がある場合、タブ文字が消えてしまいます。 読み込むテキストファイルはShift-JISで保存されています。 なにか回避策はございませんでしょうか。 よろしくお願いいたします。

  • ファイル読み込みが上手くできません

    C言語初心者です。 現在、ファイルの情報を構造体に読込んで実行するプログラムを作成しております。 読込むファイルは700MBほど(行数は39900000行)となっており、1行ずつfscanfで読込んでいます。 400000行ごとに構造体に読込んで、処理を実行し、構造体に読込んだ全ての処理が完了したら、再度400000行読込んで・・・を繰り返すものになっております。 400000行ごとにしているためforループで100回まわすようにしているのですが、最後の1回(100回目のループ)で、99回目と同じ場所を読んできてしまいます。 つまり、最後の1回だけはファイルポインタが進んでいない状況になります。 コードは下記になります。 #define MAX_SIZE 400000 uint64_t i = 0; uint64_t fc = 0; int main(int argc, char *argv[]){ char w[] = "$write"; char r[] = "$read"; // ファイルを構造体へ格納 char filename[] = "TEST_READ_WRITE.txt"; struct TEST_DATA{ char cmd[10]; int addr; int bsize; }; FILE *fp; if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (int lp = 0; lp < 100; lp++){ struct TEST_DATA TD[MAX_SIZE]; // 構造体配列の宣言 for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", TD[fc].cmd, &TD[fc].addr, &TD[fc].bsize); } } while (i < MAX_SIZE - 1){ //ファイルから取得したデータによって処理を実行 if (strcmp(TD[i].cmd, w) == 0){ //書込み処理 } if (strcmp(TD[i].cmd, r) == 0){ //読み込み処理 } } printf("Finish!! \n"); } fclose(fp); return 0; } 読込むファイルはテキストデータで、 $write 25651496 152 $write 135878112 8 $read 1244848 16 のような感じのものが39900000行並んでいるものになります(数字はランダムです)。 最後の1回のみ上手くファイルポインタが進まない原因が分からずに困っています。 お気づきの方がいらっしゃいましたら、アドバイスをよろしくお願いします。

専門家に質問してみよう