例えば以下のような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の標準のクラスではこういったことは可能なのでしょうか?

私なりに調べてみたのですが調べ方が悪いのか知識が及ばないため、
こちらで質問させていただきました。
もしご存知の方がおられましたらアドバイスいただけますと助かります。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

Javaはしばらくいじってないのであれですが・・・



仮にreadline(9999)というような関数があるとしても内部的には
for(int i=0;i<9998);i++){
br.readline()
}
と同じことをしていて スペック的にはほとんど変わらないはずです。
9999行目を読み込むためには 1行目から順に最初からファイルを読んでいって改行の数を数えてやる必要があるので・・・


見栄えがというのであれば自分でBufferedReader を継承して独自のクラスを作ってしまったらいかがでしょう?
readline(int line)だけ書いてやるだけだから5分とかからないし・・・


なおJavaは最近いじってないので標準関数でご希望のものがあるかはわかりませんが
自分だったらそんなことで悩んでる暇があったら自分で書いちゃいます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/19 16:41

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

れいになっても効率は変わらないです.
    • good
    • 1
この回答へのお礼

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

お礼日時:2011/04/19 16:41

JAVAを全く知らない私が言うのもなんですが、


特定の行ということは、改行コードがいくつ入っているということを読んで調べないと
どこから始まっているのかわからないとおもいます。(のでむりだとおもいます。)
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/19 16:41

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q復元ポイントの作成とイメージファイル等のバックアップとの違いについて

今晩は、宜しくお願いします。

復元ポイントの作成とイメージファイル等のバックアップとの違いについて教えて下さい。

Windowsで復元ポイントからシステムを復元させる方法があり、
また、イメージファイル等にバックアップをとり、復元させる方法もありますが
この両者はどのように違うのでしょうか。

復元ポイントの作成とは、その時点のシステムの設定等だけを保存しているという
ことでしょうか。

また、イメージファイル等のバックアップを作成するということは
システム設定と作成したファイル等もイメージファイルとして一括してバックアップ
されるのでしょうか。

イメージファイルの復元時に、作成したファイル等もイメージファイルから
復元されるのなら、同じ名前のファイルがあった場合には、
イメージファイル作成時の古い情報のファイルになってしまうのでしょうか。

以上、宜しくお願いします。

Aベストアンサー

【システムの復元】
Windowsが使用するシステムファイルのバックアップと復元。
ユーザーファイルには影響しない。
HDDの中に作成されるので、Windowsが起動しない環境では使用出来ない。

【システム修復ディスクの作成】
Windowsの起動時にF8を押下して起動するセーフモードから「コンピューターの修復」「システム回復オプション」を、外部記憶装置(CD、USBメモリなど)から起動出来るようにする。
Windows自体が起動しなくなった場合に、外部記憶装置から「システム回復オプション」が起動出来るようになる。修復されるのは、選択した項目により異なる。
WindowsREを利用。
https://msdn.microsoft.com/ja-jp/library/hh825173.aspx

【バックアップと復元】
システムのバックアップを作成し、ハードディスクなどが壊れた場合に備えパソコン内部のデータを全てバックアップ・復元出来る。
Windowsのインストールディスクや、システム修復ディスクから復元が可能。
システムもユーザーデータもバックアップを取った時点の状態に戻る。

【システムの復元】
Windowsが使用するシステムファイルのバックアップと復元。
ユーザーファイルには影響しない。
HDDの中に作成されるので、Windowsが起動しない環境では使用出来ない。

【システム修復ディスクの作成】
Windowsの起動時にF8を押下して起動するセーフモードから「コンピューターの修復」「システム回復オプション」を、外部記憶装置(CD、USBメモリなど)から起動出来るようにする。
Windows自体が起動しなくなった場合に、外部記憶装置から「システム回復オプション」が起動出来るようになる。...続きを読む

QJSP/Servlet DBからデータを読み込み、CSV形式でダウンロードさせる・・・・

まず、あるボタンをおすと、Servletに飛ばして、そこでDBから特定のデータを読み込んで、読み込んだデータをカンマ区切りにして、ダウンロードさせます。
そして、ダウンロード直後にそのファイルを開かせないで、ダウンロードした人が任意の場所にファイルを保存させたいのです。 

ダウンロード自体はできているのですが、どうしてもダウンロード直後にエクセルファイルでひらいてしまい、任意の場所に保存させることができません。Officeの入っていないPCなら任意の場所に保存させられるようなのですが・・・・。

解決案をお待ちしております。

Aベストアンサー

resp.setHeader("Content-Disposition", "attachment; filename=\"tets.csv\"");

Servlet でこの一行を入れてみてはどうですか?
JSPはこの場合、関係ないですよね?
多分、attachment; が開かない様にしてくれたかと思うんですが。。。

適当です。間違っていたらすみません。

Q救出ファイル復元 2の機能について

「救出ファイル復元 2」で画像ファイルJPEGの他にRAWファイル、拡張子(CR2)を復元出来るでしょうか。

キャノンの一眼デジカメを使っているのですが、他の復元ソフトでは、復元出来ませんでした。

Aベストアンサー

Vectorあたりで『ディスク・ファイル復旧』の項目で探せばみつかりそうですが。
要は,"復元ソフトで復元できるファイルがソフトに登録されている拡張子だけしかできない"ことですので,拡張子を選択できる復元ソフトを捜せばいいと思われます。

参考URL:http://www.vector.co.jp/vpack/filearea/win/util/disk/care/

QCSVファイル読み込みについて

Java初心者なので初歩的な質問をするかも知れませんが、ご勘弁ください。

今CSVファイルを読み込むプログラムを作っているのですが、
CSVファイルを列ごとに読み込みたいのです。(全体は読み込める)

いろいろ調べましたが、全く方法がわかりません。
どうかご教授よろしくお願いします。

Aベストアンサー

CSVファイルは基本的にはテキストファイルなので、dyna_1550さんの仰るとおりBufferedReaderでいけます。

"ズバリ"なサイトを参考URLにリンクしましたので、参考にしてみてください。

参考URL:http://web.hc.keio.ac.jp/~fujimura/lang/page-14-3.html

Q削除した画像ファイルの取り出しまたは復元方法

ごみ箱に入れてから削除したファイルの復元方法を教えてください。

以前にも同様の質問をしたのですが、その際に教えていただいた方法で確かにいくつかのファイルは復元することができました。

しかし、一番復元したい画像ファイル(jpeg形式)が復元できません、同時期に同じく削除したファイルは無事に取り出せたのですが肝心のファイルは取り出せません。指定するファイル名、フォルダ名などの間違いはないのですが何が原因で復元できないのか理解できません。

良きアドバイスをいただければ助かります。
宜しくお願いいたします。

Aベストアンサー

こういったファイル復元ソフトを利用してファイルを復活させます。

●FileRecovery(フリーウェア)

消去・欠損したファイルを復元するソフト。
http://www.pcinspector.de/download.htm

●復元(フリーウェア)
http://www.vector.co.jp/soft/win95/util/se192983.html

■FINALDATA(ファイナルデータ)フォトリカバリー3.0(有料)
http://www.finaldata.ne.jp/f_8_3.html

当然ながら復元できる確立は有料ソフトのほうが高いです。

これらを使っても復元できない場合はファイルが上書きされて完全に消えている可能性が高いです。

Qjava CSVファイルの読み込みについて

初心者ですが、どうぞ宜しくお願いします。

CSVファイル内には3つのデータがあります。

date.csv -----------------------------------

"1組"
"1,60点,80点,80点,70点,60点"
"2,50点,55点,50点,80点,70点"
"3,80点,80点,80点,95点,60点"
"4,60点,65点,65点,60点,65点"
"5,50点,65点,60点,65点,65点"

"2組"
"1,70点,70点,80点,80点,70点"
"2,80点,65点,80点,85点,90点"
"3,65点,65点,60点,50点,80点"
"4,90点,60点,65点,60点,90点"
"5,65点,80点,90点,90点,95点"
"6,90点90点,65点,65点,95点"
"7,75点,80点,90点,90点,75点"

"3組"
"1,85点,90点,90点,90点,85点"
"2,90点,100点100点,100点,95点"
"3,100点,80点,80点,100点,95点"
"4,90点,65点,100点,100点,100点"
"5,100点,100点,100点,70点,100点"
------------------------------------------

ファイル内容は上記のようになっているのですが、
2組のデータだけを読み込みたいのですが、
どのようにすれば部分的に読み込むことができますでしょうか?

現在は下記コードのように、全て取り込み1行ずつリストビューに表示しています。
このコードを改良して、2組のみをリストビューに表示したいのです。

try {
// create reader
InputStream input = new FileInputStream(path);
InputStreamReader ireader=new InputStreamReader(input, "UTF-8");
CSVReader reader = new CSVReader(ireader,',','"',0);
String[] csv;

while ((csv = reader.readNext()) != null) {

//アイテムの追加
list.add(csv[0]);
}

//アダプターの初期化
Date_lst.clear();

ArrayAdapter<String> lstadapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,Date_lst);

ListView listView = (ListView)findViewById(R.id.listView1);

//ListViewにアダプタ登録
listView.setAdapter(lstadapter);


for(int i= 0; i < list.size(); i = i + 1){
Date_lst.add(list.get(i));
}


} catch (FileNotFoundException e) {
Log.e("ERROR", e.toString());
} catch (UnsupportedEncodingException e) {
Log.e("ERROR", e.toString());
} catch (IOException e) {
Log.e("ERROR", e.toString());
}
}

ご教授宜しくお願いいたします!

初心者ですが、どうぞ宜しくお願いします。

CSVファイル内には3つのデータがあります。

date.csv -----------------------------------

"1組"
"1,60点,80点,80点,70点,60点"
"2,50点,55点,50点,80点,70点"
"3,80点,80点,80点,95点,60点"
"4,60点,65点,65点,60点,65点"
"5,50点,65点,60点,65点,65点"

"2組"
"1,70点,70点,80点,80点,70点"
"2,80点,65点,80点,85点,90点"
"3,65点,65点,60点,50点,80点"
"4,90点,60点,65点,60点,90点"
"5,65点,80点,90点,90点,95点"
"6,90点90点,65点,65点,95点"
"7,75点,80点,9...続きを読む

Aベストアンサー

String str = "abc";
として
strが"abc"かどうか
ってif文わかります?
それと同じですよ。
わからなければ…調べればすぐわかる内容です。

Q「ウイルス感染ファイル」削除後のシステム復元でどうなる?

ウイルスバスターで幾つかのウイルス感染ファイル発見し全て削除しましたが、感染したファイルはシステムファイルでしたので少し心配でしたが削除しました。
そこで教えて頂きたいのですが、感染した日付以前でシステムの復元をする事によって削除されたシステムファイルは復元できるのでしょうか?一度削除されたシステムファイルはシステムの復元をしても二度と復元しないのでしょうか?

Aベストアンサー

以下WindowsXPという前提で・・・

>システムファイルでしたので少し心配でしたが削除しました。
通常、このままではシステムエラーが発生します。
しかし、Windowsには自動復旧機能があり、削除されたファイルをハードディスク上にあるCabファイルから呼び出して復旧させるようになっています。
従って、殆どの場合、削除されたシステムファイルを手動でインストールする必要はありません。

☆SFCの実行
もしシステムエラーが出る場合SFC(System File Checker)の実行をお勧めします。

1.CDドライブにOSのインストールディスクを入れておく。
2.「スタート」「コマンドプロンプト」または「ファイル名を指定して実行」で
「sfc /scannow」と入力して「OK」

「Windows XP professional のディスクを入れてください」という表示が出ることがありますがHome Editionであれば「無視」を選んでスキップしてください

>感染した日付以前でシステムの復元をする事によって削除されたシステムファイルは復元できるのでしょうか?
出来ないことはないでしょうが、あまりお勧めできません。
現在の状態が正常でない。
過去の状態の方が快適に操作できる。
という場合、それがいいかもしれません。
しかし、Windowsの設定というのは非常に広範囲にわたっており、現在と過去を比較して、どちらが適正かを判断するのは容易ではありません。
また、過去の復元ポイントの中には不正な設定が含まれている場合があり、間違って、そのポイントを選択することもあります。
ウィルス対策ソフトのサイトでは一旦復元設定を無効にして、過去の復元ポイントを全て消去することを推奨しています。

>一度削除されたシステムファイルはシステムの復元をしても二度と復元しないのでしょうか?
間違った操作をすると汚染されたファイルが復元されてしまいます。
一旦復元設定を無効にして、過去の復元ポイントを全て消去することで汚染されたファイルは二度と復元しません。

以下WindowsXPという前提で・・・

>システムファイルでしたので少し心配でしたが削除しました。
通常、このままではシステムエラーが発生します。
しかし、Windowsには自動復旧機能があり、削除されたファイルをハードディスク上にあるCabファイルから呼び出して復旧させるようになっています。
従って、殆どの場合、削除されたシステムファイルを手動でインストールする必要はありません。

☆SFCの実行
もしシステムエラーが出る場合SFC(System File Checker)の実行をお勧めします。

1.CDドライ...続きを読む

QCSV読み込み 文字化け

失礼いたします。
以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。
分かる方、よろしくお願いします。
-------------------ソースはここから
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) {
キャッチ処理
}

失礼いたします。
以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。
分かる方、よろしくお願いします。
-------------------ソースはここから
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.i...続きを読む

Aベストアンサー

>BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"EUC_JP"));

テキストファイルを読み込む際に、エンコードをEUC_JPにしていますが、
作成されたCSVファイルのエンコードは何でしょうか?
Shift_JISとかになってませんか?

Q復元ソフトのふと感じた疑問 -ファイル名を削除したい-

先日、復元ソフトを使用していたときに感じたことなのですが
(使用ソフトは「復元」です。)
ファイルを復元する際の手順で削除したファイルが検索できますよね。
このファイル検索の時に、HITしないようにファイル名を完全に削除したい場合はどのようにすればいいのでしょうか??

例えば、「●●との秘密旅行001.jpg」のファイルを削除したとします。
その後、復元ソフトで検索をかけるとファイルを復元しなくてもファイル名を見ただけで怪しいファイルとわかってしまいますよね。
復元ソフトの検索で、表示されなくする方法か、別名に変える方法があるのなら教えてください。

Aベストアンサー

95159さんが求めていらっしゃるのは以下の方法ではないでしょうか。

フリーの復元ソフトに「DataRecovery」というものがあります。このフリーソフトには「削除したファイル」の名前を時間をかけず簡単に消去できる機能が付いています。

『DataRecovery』
http://www.vector.co.jp/soft/win95/util/se382922.html

■使い方
起動させる→該当ドライブをクリック→[スキャン]ボタンをクリック→削除したファイルの表示完了→「目的のファイルが見つかりましたか?」と出てきたら[キャンセル]をクリック→名前を消去したいファイルをクリックするか、名前を消去したい複数ファイルを左クリックしながら選択する→[消去]ボタンをクリック→[OK]をクリック

これで、名前を消せます。しかしながら完璧ではなくて、一部消せないこともあります。
(「DataRecovery」を再起動してもう一度ドライブをスキャンすると消せなかったファイルが表示されます)

参考URL:http://www.vector.co.jp/soft/win95/util/se382922.html

95159さんが求めていらっしゃるのは以下の方法ではないでしょうか。

フリーの復元ソフトに「DataRecovery」というものがあります。このフリーソフトには「削除したファイル」の名前を時間をかけず簡単に消去できる機能が付いています。

『DataRecovery』
http://www.vector.co.jp/soft/win95/util/se382922.html

■使い方
起動させる→該当ドライブをクリック→[スキャン]ボタンをクリック→削除したファイルの表示完了→「目的のファイルが見つかりましたか?」と出てきたら[キャンセル]をクリック→名...続きを読む

QCSVファイル読み込み、書き込み時の一般的な方法

いつもお世話になります。

下記CSVデータの場合の分割された結果を示していますが、データを分割する際、一般的には、
どのような考え方で分割するロジックを組めばよいでしょうか。

CSVファイル読み込み、書き込み時におけるルール。
(間違っている、漏れているなどありましたらご指摘頂ければと思います。)
・ダブルコーテーションで括る必要のあるデータ
 以下のデータを含むデータ。
  区切り文字、改行、ダブルコーテーション

・ダブルコーテーションが入るデータは、ダブルコーテーションでエスケープする
 aa"bb ⇒ aa""bb
 
上記ルールに則ったCSVファイルの読み込み方。
 123,aaaaa,ああいい,"13,55","aa""bb","ab(改行)ZZ","ああ"",いい"
  ↓
 データ1 123
 データ2 aaaaa
 データ3 ああいい
 データ4 13,55
 データ5 aa"bb
 データ6 ab(改行)ZZ
 データ7 ああ",いい
  
上記結果になるようにデータを分割すればいいのですが、データにダブルコーテーションがある
場合、書き込み時に付与、読み込み時に削除、という具合にデータの編集処理が入ってしまうが
いいのか、何かのミスで、ダブルコーテーションがエスケープされておらず、カンマと連続で
定義されていた場合「",」、データの終わりを示してしまい、意図しない個所で分割されてしまうの
ではないか、何かのミスでダブルコーテーションの始め、もしくは終わりの定義が漏れいた場合
(「・・・,"aaaa,・・・」「・・・,aaaa",・・・」など)、これも意図しない個所で分割されてしまう、
などなど、一般的にはどのようなロジックにしておけばよいのでしょうか。
そもそもロジックで全てを防ぐ事はできない、ということでしたら、事前にこれだけは決めておくべき、
というポイントがありましたら、教えて頂けると嬉しいです。

世の中には、CSVファイルを分割するためのライブラリなどが公開されていますが、
外部のライブラリを使用してはいけないプロジェクトの場合など、自分で自作する必要があります。
その際の一般的な考え方、注意点などを踏まえて作ることができれば、無用なバグを含ませる
ことができずにすむので、皆様の考えを教えて頂きたいと思い、質問した次第です。

宜しくお願いします。

いつもお世話になります。

下記CSVデータの場合の分割された結果を示していますが、データを分割する際、一般的には、
どのような考え方で分割するロジックを組めばよいでしょうか。

CSVファイル読み込み、書き込み時におけるルール。
(間違っている、漏れているなどありましたらご指摘頂ければと思います。)
・ダブルコーテーションで括る必要のあるデータ
 以下のデータを含むデータ。
  区切り文字、改行、ダブルコーテーション

・ダブルコーテーションが入るデータは、ダブルコーテーションでエスケー...続きを読む

Aベストアンサー

それで問題はない。
逆に聞きたい。
余計なダブルコーテーションが入った時(またはダブルコーテーションが不足した時)どうしたいのか?
データを解析して、余計なダブルコーテーションを自動削除(または不足するダブルコーテーションを自動追加)して読み込めるようにしたいのか?
普通はそこまでの面倒は見ません。
単純にデータエラーにします。(またはデータがずれたまま読みこまれる)

CSVファイルなので、改行位置で分割したほうが都合が良いと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング