以前、ファイル整理ツールを作ったのだが、いよいよまともに稼働させようと思い利用すると、ファイルが多いせいか遅い

ボトルネックはディレクトリ構造の読み込みである。Dir関数を使ってファイル、フォルダを読み込んでいくのが大変に遅い。同じディレクトリ構造をDOSコマンドでファイルに出力すると相当高速である。10倍どころの話ではない。これを利用した方がよさそうである。

なお、コマンドも

DIR > hoge.txt /s

よりは、

DIR > hoge.txt /s /a:-d

の方が解析しやすい。これで入力ファイルを作成/解析してデータを作っても処理時間はおつりが来るだろう。

さて、改造はそれがメインではない。処理も「正」「副」のディレクトリを指定し、同じファイル名で時間/サイズが同じなら副側を削除する、というように改変しようと思う。

完成したらサンプルでも配布するか、と思っている。

Windowsの内部コードはUnicodeである。Excelでも、バージョンが 5 から 95 になった際に内部コードが Shift-JIS から Unicode になったため、Len 関数と LenB 関数の差で全角文字の数を調べたりするような処理ができなくなった。

つまり、全角も半角も、Len は 文字数、LenB は文字数の倍を返すようになった。つまり、全角も半角も2バイトなのだ。

 

で、Unicode イコール 2バイトなんだ、という頭で居たが、それは間違いであった。というのも、Unicodeと言っても UTF-8, UTF-16 など、幾つかの規格が存在するのだ。

 

さて、ちょっとした調べごとをするにあたり、Excelのシート上の文字をコピー&ペーストするのが件数が多くて面倒なので、検索エンジンで検索させ、結果を標準ブラウザで開く、という処理を作ってみようか、と思って着手してみた。

インターネットの世界ではUTF-8が強い。例えばYahooのアメリカのサイトはUTF-8で書かれているし、検索エンジンにもUTF-8という文字がパラメータで渡り、全角文字は%EF・・とかいう形式になるが、これもUTF-8のコードをエンコードしているだけである。

UTF-8 は Unicode だから、その文字コードを分解すればいいか、というと、そうは問屋が卸さないUTF-8では半角文字が1バイト、全角文字は3バイトになっているではないか!半角も全角も2バイト、という内部コードとは異なるのだ。同じUnicodeという名を使いながら、コード体系が異なるのである。

 

調べてみると、内部コードはUTF-16だそうだ。UTF-16にもBE、LEに分かれるらしい。ということは、%EF・・とかいう形式にするには、UTF-16 から UTF-8 に変換し、そのあとバラす必要があるようだ。

VBAで作るのも一興だが、DLLとか、探せばあるんだろうな・・。

 

参考

 WikiPedia Unicode

 

 

VBAからCやPascalで作ったDLLを利用することはできる。
.netになったらどうなのか?

調べた限りでは、「あまり期待できない」ようだ。
・Accessの方がマシ
・Visual Studio 2008よりは2005, 2005よりは2003 で作った方がマシ
のようである。

Officeの各バージョン、Visual Studioの各バージョンが揃っているわけではないの実地では調べていないが、VBAと連携するならVisual C++, Borrand C++(すでにフリーになっている。DLLはあったか?), Delphi (Win32ネイティブのオブジェクトも作れる)等の言語の方で作成した方がよさそうだ。