ランダムファイル懐古

最近File.xlsm(旧File.xls)を整理している中で出くわしたものである。その昔、NECPC-8801MK2で初めてパソコンというものをさわったとき最初に作った実用的に使えるプログラムがランダムファイルを使ったものだった。なつかしい。今はどれも手元にはないが、N88-BASIC関係の本を多数出していたナツメ社の緑色と白色の混じった本を思い出す。

当時はパソコンの草創期である。もちろんこんなビジュアルなものではなかった。黒い画面上に白い文字が平板的に流れていくだけのものだった(今でいうコマンドプロンプトの画面に近い)。ソフトなどもほとんどない、だから自作するしかない状態だった。あの時は、1つのデータ(レコード)が256バイト(いや128バイトだったかも)で、日本語はもちろん半角カタカナだけだったが、そんな程度でも実用になった。思えば、すべてについて貧弱な時代だった。だから自分で工夫していくしかなかった。

今こんな骨董品的なランダムファイルをエクセルで使う必要性はほとんどないが、住所録管理などのツールではまだ出番があるかもしれない。それを今に合わせて再生して作り変えてみた「試作品」である。

ツール
RandomData.frm@File.xlsm

データの読み書きは「No.」を手掛りにする。これは基本的にはレコード番号(下部にPOSで表示)と一致させる。したがって一意的にデータが特定できる。
起動と同時にデータファイル(randomdata.dat)を読み込む。
「レコード数」は現在のデータの数である。
「POS」は現在画面に表示されているデータが何番目のものかを表示する。


データ表示
「No.」の部分に数字を書き込んで押せばそのデータが表示される。

データ書き込み
現在画面に表示されているデータを修正したり変更したあとそのデータを上書きする。

データ消去
現在画面に表示されているデータを削除する。


現在画面に表示されているデータより1つ前のデータを表示する。


現在画面に表示されているデータより1つ後のデータを表示する。

検索
「Name」の部分の部分一致検索である。「奈」を入力すると「能年玲奈」や「小池里奈」などのデータが順次ヒットして表示される。

CSV File化
今読み込んでいるファイルを全部CSVファイル(randomdata.csv)として書き出す。


問題点

ランダムファイルの最大の問題点はデータの削除と追加で生じる。これらはランダムファイルのもつ「宿命」みたいなものである。

削除
特定のレコードのデータを削除しても、そのエリアはディスク上の固定位置に固定サイズ分だけ領域を占めている(ムダにファイルサイズが大きくなる)ということである。
削除後に「ムダな領域の存在」が生じて、そのままではそれが解消されないことである。これはパソコン草創期の原始BASICの場合もそうだったが、進歩のないBASICでは今でも変わっていない(と思う)
この「ムダ」をなくすには、最初から最後まで順次データを見ていって、カラのデータがある部分はそこをスキップして別ファイルにコピーしていくしかない。

SAMPLE
既存ファイル→○○×○○○××○○
新規ファイル→○○○○○○○

追加
また、今はデータが10個しかない。この場合、新規にデータを追加するときには11番目にデータを設定するのが普通である。しかし、この場合100番目にデータを追加することもできてしまう。その場合、11番目から99番目までの領域にはカラのデータが埋まることになる。ファイルサイズもそのムダな部分を含んで肥大化することになる。

SAMPLE
現在→○○○○
追加→○○○○××××××××○

この対策としては、新規に追加する場合は、既存データの量を調べて、それより1個多いだけの位置にしか追加できないようにすることになる。


CSVファイルとの関連

C/C++言語の場合と同じように、ランダムファイルは簡単にCSVファイルに変換できる。
これはバイナリファイルやランダムファイルを使う場合の「妙味」にもなっている。バイナリファイルはプログラムと密接に関係した秘匿性の高いファイルだが「そのプログラム」での使用に限られる。CSVファイルは単なるテキストファイルであり誰でも見ることができる。バイナリファイルであっても、いつでも一般的に互換性のあるテキスト(CSV)に直せるから、安心してそれらを使えることになる。
今までCSVファイルを使う必要性がなかったのはこういうことも原因になっていた面が大きい。CSVファイルなどは他人にデータを渡す場合以外に使い道はなかった(バイナリファイルでは相手には使い道がない)。

ツール
RandomData_CSV@File.xlsm (RFile)


当時はもちろんCSVファイルなどというもの、そしてその概念もなかった。これは今風いまふうに追加したものである。


Binary操作との関連

ランダムファイルのオープンの例は、たとえば次のような形になる。
SAMPLE
Open strFile For Random Access Read As #nFile Len = Len(Data)

これをバイナリファイルのように操作することができる。その場合は次のような形になる。
SAMPLE
Open strFile For Binary Access Read As #nFile

この両者の操作は多くの部分で共通している。したがって、どちらか一方だけを知っていれば十分である。


RandomでのLen関数

これは文字列を対象としたLen関数とは名前は同じでも動作はまったく別のものである。次の両者を混同しないように注意する必要がある。
  1. ランダムファイルの場合
    Typeで設定したレコードのバイト数を表わす。
    ランダムファイルで作成されるファイルの大きさは、このバイト数×レコード数の大きさ(バイト)になる。
    したがって、LenBはランダムファイルのType型のデータに使っても無意味である。LenB(Data)には何の意味もない。

  2. 文字列の場合
    VB/VBAで使われるString型の文字列の文字数を表わす。
    LenB関数はString型の文字列のバイト数を表わす。
    ExcelなどのVB/VBAファミリーで使われるのはUnicodeであるから1文字が2バイトになる。LenBはLenの値の2倍になる。
- 2015/07/19 -







RandomData.frm@File.xlsm(exc_0071)