バイナリモードでの検索追加について


しっぽ  2005-03-30 17:14:17  No: 120559

バイナリモードでファイル開き、
例えば ABC という3文字の半角文字が格納されている部分を見つけ、
それ以降のデータ(ABCを先頭に付けて)を別のファイルもしくは、
配列に格納するプログラムを考えています。
ただし、このABCという半角文字はファイル中にいくつか存在し
長さも固定長ではない為、どういった検索方法が良いのか教えてください。

尚、ABCが格納されているファイルは複数存在し
File_01.DAT
File_02.DAT
File_03.DAT
File_04.DAT を
File_SAVE.DAT にまとめる形になります。

各ファイルの中身も、ABCxxxxデータABCxxxxデータABCxxxxデータ 
のように入っています。
xxxxはインデックス番号になります。

処理として考えているのは、File_01.DATからFile_04.DATの
ABCの開始位置、インデックス番号を変数や配列として保持させ
その情報を元にFile_SAVE.DATに追加していく形を考えています。
ただ、ファイル容量が200MBなどになる場合、
この方法は効率が良いのか悩みます。
同じファイルを二度開くのが引っかかっています。

後、ABCのコードなのですが
これらのファイルにDC、FFGHの様に2、3、4バイトのデータも
検索対象に含めるとしたら、どのような方法が良いのでしょうか?

ABC0001
    FFGH0001
    FFGH0002
    DC0001
    DC0002
ABC0002
    FFGH0001
    FFGH0002
    DC0001
    DC0002
ABC0003
    FFGH0001
    FFGH0002
    DC0001
    DC0002

↑のような形になります。


Say  2005-03-30 17:58:20  No: 120560

>それ以降のデータ(ABCを先頭に付けて)
抽出データの先頭が「ABC」なのはいいとして、終端はFile Endかなにか?

それはともかく、1パスで処理可能なのでは?
2パスにする理由がわかりませんが・・・。
抽出したあと前後関係を見ての整形やソートが必要とか?


特攻隊長まるるう  2005-03-30 21:05:32  No: 120561

いま、どの段階まで修正可能なのでしょうか?
ファイルの仕様まで変更が可能なら、DAT ファイルの形式を
もっと検索しやすい形に変更すればいいと思うんですが?。
その段階なら
過去ログ検索『比較』『検索』『バイナリ』あたりでどんな
手法を使っている人がいるのか調べるだけで、大きく方向が
変わってしまいます。

>各ファイルの中身も、ABCxxxxデータABCxxxxデータABCxxxxデータ 
>のように入っています。
この表現だと、改行(または区切り文字)なしのデータとしか
解釈できないから1つの文字列から Instr 関数などで検索
する…となりそうですが、
>ABC0001
>    FFGH0001
>    FFGH0002
>    DC0001
だと"ABC"は必ず行頭。"FFGH""DC"は行頭から全角スペース
2個の後…という法則ができてしまってます。何らかの法則
があるなら、それに合わせて検索すれば、早く検索できる
可能性もあります。

この状態では回答しようがないと思いますが?。


しっぽ  2005-03-31 17:33:57  No: 120562

>Say様、特攻隊長まるるう様
ファイルの終端を判別するものは特にありません。
ファイルの変更は一切できません。

ファイルの中身は
ABC0001FFGH0001データFFGH0002データDC0001データDC0002データABC0002FFGH0003データFFGH0004データDC0003データDC0004データABC0003と続いており、
中にスペースは存在しません。

1パスに拘っている訳ではありませんが、
それぞれのファイルの先頭100バイトくらいは、
累積する情報が含まれており、それを1つのファイルにまとめます。
ファイルの終端はそれぞれのインデックスを表す情報を入れます。
1パスで見るにしても、先頭の100バイトを別の場所に保存した後、
それぞれのインデックスを抽出しつつ、
データをインデックス(別のファイルなら更新)付きで一箇所にまとめる・・・
上手い方法があれば是非教えて頂きたいと思います。

1パス、2パスどちらを選ぶにしても
インデックス検索の良い方法が一番知りたいです。
すみません。バイナリファイルの経験が浅く、
自力で解決できる程のレベルではないもので、気分を悪くされない事を願っています。


特攻隊長まるるう  2005-03-31 22:57:08  No: 120563

>ABC0001FFGH0001データFFGH0002データDC0001データDC0002データABC0002FFGH0003…
うーん。『データ』の最後はどうやって判別するの?
『データ』の中にキーワードの『ABC』や『FFGH』などが存在する可能性は?

区切り文字もなし、データ長も法則がないと『インデックス検索』と言われても
インデックスなのかただのデータなのか区別が付かない気が…ただの『文字列検索』
をするか、むしろ先頭から1文字ずつ判別するか…文字列検索して存在すれば
その文字で区切って、区切った中で次の文字列検索するか…。


しっぽ  2005-04-01 06:45:49  No: 120564

>特攻隊長まるるう様
法則は、
ABCの中にFFGH、DCのデータ部を含んだブロックが存在し、
データ長は可変、ファイルの終端に各インデックスの番号が付加されるだけです。
もちろん、データの中にはそれらのインデックスは存在しません。

ファイルの中身を知るにも
ABCの開始位置と終了位置(または次のABCの位置)を調べてから、FFGH、DCと
見て行くしかないのでしょうか?
それとも判別(1バイトで)しつつデータを格納して1パスにするのが良いのでしょうか?。
インデックスはどうしても取得しなければならないので、
なかなか良い方法が見出せないままです。


特攻隊長まるるう  2005-04-02 12:19:01  No: 120565

レスも付かないようですし、そんな感じで好きな方を
選んでプログラムすれば良いんじゃないでしょうか?(。_゜)


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加