ファイル中のある特定の文字列の数行先の行の文字列を抜き出す

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mo

ファイル中のある特定の文字列の数行先の行の文字列を抜き出す

#1

投稿記事 by mo » 9年前

いつもこのサイトにはお世話になっています。
また助言をいただこうと思って書き込みをさせていただきます

件名の通り テキストファイル中の、ある特定の文字列の数行先の行の文字列を抜き出す ということがしたいのですが
今、自分で思いつたのが

コード:


void GetInputData(FILE *fp_input, char key[])//key[]は検索キーワード
{
	
    int counter = 0;
	int i;
		
    int length = GetFileLength(fp_input); // ファイル全体の大きさを取得する関数
    char *str = (char*)calloc(length*2, sizeof(char)); // 念のために多くとっておく
    int now_position = ftell(fp_input); // 現在の位置を保存しておく
 

    for (counter = 0;fgets(str, length, fp_input) != NULL; counter++){ // EOFが来るまで一行ずつ読み込む
		
		if(strstr(str,key)){ //キーワードに引っかかったら
			for(i=0;counter+2 > i; i++){//(今回の場合は)その次の行までもう一度読み見込む
				fgets(str, length, fp_input);}
			printf("%s",str);//欲しい行を表示
		}
	}
			
	fseek(fp_input, now_position, SEEK_SET); // カーソルを最初に保存した位置に戻す
 
    return ;


というような、かなり冗長な内容になってしまいました。このテキストファイルというのがなかなかに膨大なもので、何度も読み込みを繰り返すこのプログラムでは時間がだいぶかかってしまいます。しかもバッファサイズも多めに取らないといけないかなーとか思ったり…

テキストファイルを読み込み、特定の行の次の行(又は数行先)を抜き取るうえで、もっとシンプルな形にするにはどうすればいいでしょうか。
ご助力いただければと思います。

OSはWindows 7 で、Microsoft Visual C++ 2010を使っています。
よろしくお願いいたします。

maru
記事: 150
登録日時: 9年前

Re: ファイル中のある特定の文字列の数行先の行の文字列を抜き出す

#2

投稿記事 by maru » 9年前

膨大とはどの程度のものでしょうか?
一度に全部メモリに載せることが出来るのか、できないのか?
そこがポイントです。

MB以下であれば全部読み出して、文字列配列に行ごとに格納してから検索を行えばいいでしょう。
なお、サイズは環境によって替える必要があるでしょう。

メモリに載せられない場合、ファイルを読みながら検索するしかありませんが、検索文字列が複数あるの
なら一行読みだすごとに、文字列検索を検索文字列数回繰り返すようにするなど、ファイルの読出し数は
最小回数になるようにしないと、性能面で問題になりそうです。

ところで、

コード:

    int length = GetFileLength(fp_input); // ファイル全体の大きさを取得する関数
    char *str = (char*)calloc(length*2, sizeof(char)); // 念のために多くとっておく
このGetFileLengthがファイルサイズを返す関数だとすると、膨大なファイルサイズのさらに2倍のメモリ
を確保していますが、本当に必要ですか? strには一行分の文字列しか入らないように思えますが。

逆に、本当にこのメモリ確保が実行可能なら、ファイル全体をメモリに載せておくことが可能ですので、
文字列配列(もしくは文字列リスト)に読み込んでから検索処理を実行できそうです。

たかぎ
記事: 328
登録日時: 10年前
住所: 大阪
連絡を取る:

Re: ファイル中のある特定の文字列の数行先の行の文字列を抜き出す

#3

投稿記事 by たかぎ » 9年前

メモリマップドファイルを使うという選択肢はないのでしょうか?

maru
記事: 150
登録日時: 9年前

Re: ファイル中のある特定の文字列の数行先の行の文字列を抜き出す

#4

投稿記事 by maru » 9年前

たかぎ さんが書きました:メモリマップドファイルを使うという選択肢はないのでしょうか?
なるほど、その方が手軽ですね。

mo

Re: ファイル中のある特定の文字列の数行先の行の文字列を抜き出す

#5

投稿記事 by mo » 9年前

maruさん
返信ありがとうございました。
fgetsで読み込んだものはすべてバッファ格納されていくものだと勘違いしていました。一行読むたびにバッファの中身が更新されるんですね。お恥ずかしいです。

たかぎさん
返信ありがとうございます。
メモリマッピングは今まで使用したことがありませんでした。調べてみて、使ってみます。理解できるかなぁ(´・ω・)

閉鎖

“C言語何でも質問掲示板” へ戻る