マクロによるCSV操作についてNo.31201
surebass さん 12/05/11 14:41
 
30列70000行のCSVファイルをマクロで操作しています。
不要な列を削除する処理です。
そのために記述したマクロ文がこちらです。

replaceallfast "^(([^,]?)*),(([^,]?)*)\\f,(([^,]?)*)\\f,(([^,]?)*),(([^,]?)
*),(([^,]?)*)\\f,(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),
(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),
(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*)\\f,
(([^,]?)*)\\f,(([^,]?)*)\\f,(([^,]?)*),(([^,]?)*)\\f,(([^,]?)*)$","\\0\\2\\4
\\6\n",regular;

このマクロ文により、期待する置換結果を得られてはいるのですが、
20行のテストデータ上で、処理に数分かかっています。

replaceの検索値の中で「\\f」を使わないと高速なのですが、置換値の中で「\\10
〜」は仕様上使えない?ということなので、30列を操作することが出来ません・・・
なので、「\\f」でグループ化し、処理を試みた次第です。

なにがいけないのでしょうか?

[ ]
RE:31201 マクロによるCSV操作についてNo.31202
Iranoan さん 12/05/11 15:53
 
 surebass さん今日は、一ユーザの Iranoan です。
> replaceの検索値の中で「\\f」を使わないと高速なのですが、置換値の中で「\\10
> 〜」は仕様上使えない?ということなので、30列を操作することが出来ません・・・
> なので、「\\f」でグループ化し、処理を試みた次第です。
 秀丸は大量の置換は時間がかかる傾向があります。
 CSV の列削除ということなら、CSV モードに切り替え、列選択後に削除して
はどうでしょう?

[ ]
RE:31201 マクロによるCSV操作についてNo.31203
秀まるお2 さん 12/05/11 16:03
 
 \fを使った区切りが遅いということもありますが、もう1つ、コンマ区切りの1つ
のセルを指定する正規表現パターンがちょっとややこしいので遅いっていうのがあり
ます。

 セルを指定する正規表現パターンは、

     [^,]*?,

 にした方がいいです。

 そうすると、検索パターン的には、

    ^[^,]*?,[^,]*?,[^,]*?,.....[^,]*?$

 みたいな感じになります。

 これと、\fを使わない高速な方のタグ付き正規表現を使うとして、

 1〜4のセル   ... \1
 5〜6のセル   ... \2
 25のセル     ... \3
 27,28のセル(ただし最後のコンマは省く) ... \4

 になるようにカッコで囲んでやればいいです。

 最終的には、

replaceallfast "(^[^,]*?,[^,]*?,)[^,]*?,([^,]*?,[^,]*?,[^,]*?,)[^,]*?,[^,]*?,
[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,
[^,]*?,[^,]*?,[^,]*?,[^,]*?,[^,]*?,([^,]*?,)[^,]*?,([^,]*?,[^,]*?),[^,]*?$",
 "\\1\\2\\3\\4", regular;

 のようなマクロになると思います。(こちらでテストした限りはそれで置換に成功
しました)

 今回は不要ですが、場合によってはタグにヒットさせない用のカッコである、
      (?:    )

 を使って捨てる部分を囲んでやれば、\0〜\9で足りるように出来ると思います。

[ ]
RE:31201 マクロによるCSV操作についてNo.31204
surebass さん 12/05/11 17:38
 
Iranoan さま
秀まるお2 さま
ありがとうございました。

ご教授いただきました方法で期待するスピードで実現できました!

取り急ぎお礼まで。

[ ]