LoginSignup
0
1

More than 1 year has passed since last update.

[再現失敗]VBA ADODB.Stream ADODB.Streamは長い1行では1行を読み込めず、正規表現のREPLACEは失敗することがある

Posted at

今回は1行の読み込みに失敗を再現させることはできなかったが、正規表現の失敗はできた。

CMD.exe 8191字=8kb限界

コマンド プロンプト (Cmd. exe) コマンドライン文字列の制限

コマンド プロンプトで使用できる文字列の最大長は 8191 文字です。
この制限は、次の場合に適用されます。

  • コマンド ライン
  • PATH 変数など、他のプロセスによって継承される個々の環境変数
  • すべての環境変数の拡張
コマンドプロンプトを使用してバッチ ファイルを実行する場合、この制限はバッチファイル処理にも適用されます。

8190文字 = バッチファイルや画面の1行に入る最大文字数 - Windowsのコマンドプロンプト(bat,cmd)

Windows XPの場合、半角文字で、約 8 KB = 8190文字入力する事が出来ました。
ですので、通常は、「コマンドが長過ぎて、途中で切れてしまうかもしれません。」などと心配する必要はありません。
o バッチファイルとコマンドプロンプト画面の両方で、同じ結果になりました。
o 実際には、改行コードが 2バイト分入って、8KB = 8192バイトになります

とりあえず改行は入らないので、8190字=8KBが限界ということになる。

この限界はADODB.Streamにはないのか?

投稿日: 2019年3月29日 投稿者: 管理人 VBAでADODBの1行読み込みが遅い時の対処法 ムッシューのIT備忘録

時間と処理件数のグラフは以下のようになっていました。後ろの行になるほど、1件当たりの処理時間が長くなっていきます。何故かは不明ですが、後ろの行ほどその行を取得するための時間が長くなっていくためと思われ、100万行を超えてくると数十分、数時間必要となり使い物にならなくなってきます。

ファイルサイズの大きさは1行の文字数*行数で決まる。

奇妙な知恵袋の回答

VBScriptについて質問です。
処理の中でReadTextを使ってテキストファイルを読み込み、別のファイルへ出力する処理があるのですが、読み込みファイルが大きいと、下の二つの方法の処理時間に大きく違いが発生します。
特に②の処理はファイルサイズが150MBくらいになると1時間以上かかりました…。

メモリの再割り当てが原因である可能性が大です。ReadText(-1) でファイルの全内容を読み込もうとする際、メモリ再割り当て 2048 バイト単位で 8 万回弱発生する模様。
(中略)
ReadText(-2) の場合、1行分の読み込みですよね。1行で 2048 バイトを超えるということはあまり無いでしょうからメモリ再割り当てによる無駄処理による時間浪費もまた、まず考えられません。

2048はどこに出てくるのか

Accessの仕様
Adodbは当然Accessの仕様から類推できる。2048は$2^{11}$だが存在するか。

入力規則の文字数 (句読点文字や演算子を含む) 2,048
フィールドの [UnicodeCompression] プロパティが [Yes] に設定されている場合の、レコード内の文字数 (長いテキストおよび OLE オブジェクトのフィールドを除く) 4,000 $\risingdotseq2^{12}$

あった。さらにもう一つレコード内の文字数というのがある。これが1行の読み込みサイズに影響を与えている可能性がある。
長いテキスト フィールドの文字数ユーザー インターフェイスからデータを入力する場合は 65,535。これは$2^{16}-1$

コマンドプロンプトからの例をたどると、$2^{12}$以上の文字数だと限界があり、この場合、メモ型などが入らなければエラーになる可能性がある。
特にUNICODE 圧縮ができないShift-Jisだと生じる可能性が高い。
読み込みに時間がかかり、正規表現にエラーが生じるのではないか。

実験

前提

ファイルの名前、フォルダ、概要

C:\hoge\にaccdファイル、そしてtest8192.csvがある。
レコード数は2、全てテキスト。237列ある。
とりあえずテーブルは作らないため、特にフィールド名はない。
また、すべての値はダブルクォーテーションで囲まれている。
1行の文字列は5617前後
正規表現は年月日のように見えるフィールドだけ、年月日に変換する。
'REG.Pattern = "([1-2]{1})([0-9]{3})([0-1]{1})([0-9]{1})([0-3]{1})([0-9]{1})" buf2 = reg.replace(buf2, "$1$2/$3$4/$5$6")`

参照設定

Scripting.filesystemobject
Adodb.stream
REGexp


"2002","200220220111","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","20220111","20220111","2002","19560211","","","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19690211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","ここでデータ終わり236"
"2002","200220220111","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","00-0000-0000","東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて東京都新宿区東京特許許可局の局長さん3-2-1許可局総務部総務課あて","20220111","20220111","2002","19560211","","","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19690211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","19560211","ここでデータ終わり236"

成功したコード

Sub test8192()
'For access vba
'Ref set FSO ADODB Stream
Dim varN As Integer, varN1 As Integer: varN = FreeFile(): varN1 = FreeFile()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FilesystemObject")
Dim sr As New ADODB.Stream, sr1 As New ADODB.Stream
sr.Charset = "Shift-JIS": sr1.Charset = "Shift-JIS": sr.LineSeparator = adCRLF: sr1.LineSeparator = adCRLF: sr.Mode = adModeReadWrite: sr1.Mode = adModeReadWrite: sr.Type = adTypeText: sr1.Type = adTypeText: sr.Open: sr1.Open 'sr1自体は使っていない。
Dim strFile As String, strFolder As String
Dim buf As String, buf2 As String, buf3 As String, ar, iar As Long, cnt As Long
Dim REG As New RegExp, MC As MatchCollection, M As Match, iM As Long, mBuf As String, SBM As SubMatches: REG.Global = True: REG.MultiLine = True: REG.IgnoreCase = False
strFolder = FSO.GetParentFolderName(CurrentDb.Name)
strFile = "test8192.csv"
sr.LoadFromFile FSO.BuildPath(strFolder, strFile)
REG.Pattern = "([1-2]{1})([0-9]{3})([0-1]{1})([0-9]{1})([0-3]{1})([0-9]{1})"
Do While sr.EOS = False
buf = ""
buf = sr.ReadText(-2)
ar = Split(buf, ",")
cnt = 1
For iar = LBound(ar) To UBound(ar)
    buf2 = ""
    buf2 = ar(iar)
    If Len(buf2) = 10 Then ' Point 1 "20110211" なので10
        'Debug.Print "buf2", buf2
        Set MC = REG.Execute(buf2)
        If MC.Count > 0 Then
            For iM = 0 To MC.Count - 1
                buf3 = ""
                Set M = MC.Item(iM)
                Debug.Print "M.value", M.Value
                buf3 = buf2
                buf2 = REG.Replace(buf2, "$1$2/$3$4/$5$6")
                'Debug.Print "buf2", buf2
                buf = Mid(buf, 1, cnt - 1) & Replace(buf, buf3, buf2, cnt, 1, vbTextCompare) ' POINT
                cnt = Len(buf2) + 1 + cnt
                cnt = cnt + 2 ' //を2つ加算したので文字数を移動させる
            Next
        Else
                cnt = Len(buf2) + 1 + cnt
        End If
    End If
Next
Debug.Print buf
'sr1.WriteText buf, adWriteLine
Loop
Debug.Print buf
sr.Close
sr1.Close
End Sub

ポイントはreplaceを1回にするのと、分解する点である。特に今回は日付と読み込まれる文字を連続させているため、失敗しがちである。
また、今回は1行をそのまま読んだが、mode、Typeを明示したのが良かったのか。
あるいは被数字に囲まれていることを使い次のようにすることもできる。
ただし、"20011111"で日付に見えても日付ではない場合はSkipを入れる余地がなく、失敗する。
また、この場合上記のようにMCをカウントさせて回さないほうが良い。そうしないとなぜか途中で変換できない。
上記でも位置を動かしながら置換しないとうまくいかない。

Sub test8192_2()
'For access vba
'Ref set FSO ADODB Stream
Dim varN As Integer, varN1 As Integer: varN = FreeFile(): varN1 = FreeFile()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FilesystemObject")
Dim sr As New ADODB.Stream, sr1 As New ADODB.Stream
sr.Charset = "Shift-JIS": sr1.Charset = "Shift-JIS": sr.LineSeparator = adCRLF: sr1.LineSeparator = adCRLF: sr.Mode = adModeReadWrite: sr1.Mode = adModeReadWrite: sr.Type = adTypeText: sr1.Type = adTypeText: sr.Open: sr1.Open
Dim strFile As String, strFolder As String
Dim s
Dim bl As Boolean: bl = False
Dim buf As String, buf2 As String, buf3 As String, ar, br, iar As Long, cnt As Long
Dim REG As New RegExp, MC As MatchCollection, M As Match, iM As Long, mBuf As String, SBM As SubMatches: REG.Global = True: REG.MultiLine = True: REG.IgnoreCase = False
strFolder = FSO.GetParentFolderName(CurrentDb.Name)
strFile = "test8192.csv"
sr.LoadFromFile FSO.BuildPath(strFolder, strFile)
REG.Pattern = "(\D)([1-2]{1})([0-9]{3})([0-1]{1})([0-9]{1})([0-3]{1})([0-9]{1})(\D)"
Do While sr.EOS = False
buf = ""
buf = sr.ReadText(-2)
        'Debug.Print "buf2", buf2
        Set MC = REG.Execute(buf)
        If MC.Count > 0 Then
                'Debug.Print "M.value", M.Value
                buf = REG.Replace(buf, "$1$2$3/$4$5/$6$7$8")
        End If
Debug.Print buf
'sr1.WriteText buf, adWriteLine
Loop
sr.Close
sr1.Close
End Sub

実験はまだ始まったばかり

今回は100%の再現ができなかった。しかし、ミスなのか仕様なのか、そうしたものは存在している。今回は5000文字程度では読み込まれることがわかった。しかし、正規表現はやはり不安定であるということは確かそうだ。今回の位置移動型置換を試してみることとする。
次週、もう少し調査をすすめていく。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1