タグ: すべて一括置換
- 作成者投稿
- 2022年5月19日 7:37 am #30563Applek参加者
お世話になっております。
仕様なのか不具合かはわからないのですが、
マクロの録画で”すべて一括置換”と”すべて連続置換”で録画した場合でも、できたマクロはまったく同じコードになります。
これは仕様でしょうか?それと、
連続置換の項目で高度の設定でOnigmoを選択した場合でも出来るマクロは既存のままになります。
batch_list = editor.filters;
batch_list.AddReplace(“”,””,eeFindReplaceRegExp,0);
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);録画ではこのようにはならないのは仕様でしょうか?
よろしくお願いいたします。2022年5月20日 6:30 am #30565Yutaka Emuraキーマスターいつもお世話になっております。江村です。
ご報告ありがとうございます。さきほど公開した 21.7.906 と v21.7.1 で修正しました。
よろしくお願いいたします。
2022年5月20日 7:07 am #30566Applek参加者バージョンアップありがとうございます。
すべて一括置換は正規表現は、対応してないというのは、これは技術的に不可能なのか、それとも最初の段階では、とりあえず通常の置換だけに対応して随時、正規表現も対応へとバージョンアップしていくという予定でしょうか?
正規表現も含めて6000倍とかになったこれは、凄いことです。
よろしくお願いいたします。2022年5月26日 3:52 am #30571Yutaka Emuraキーマスターいつもお世話になっております。江村です。
すべて一括置換の正規表現は、beta 8 (21.7.908) で対応しましたので、お試しください。
よろしくお願いいたします。
2022年5月26日 5:06 am #30573Applek参加者バージョンアップありがとうございます。
さっそく最新バージョンを使わせていただいているいるのですが、以下のマクロが同じ動作結果にはならないのは仕様でしょうか?以下のようなサンプルです。
動作テストをするとまったく違う結果になるのは仕様でしょうか?
よろしくお願いいたします。動作テスト対象文
ののののののののののののののほっかいどうりりりりりりりりりりりりりりりり
ののののののののののののののほっかいどうりりりりりりりりりりりりりりりり
ののののののののののののののほっかいどうりりりりりりりりりりりりりりりり新しい機能のマクロ
batch_list = editor.filters;
batch_list.AddReplace(“^(.*?)ほっかいどう(.*?)$”,”\\1北海道\\2″,eeFindReplaceRegExp,0);
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo | eeExFindMulti);// 新バージョンの書き方通常の以前のやり方の置換
batch_list = editor.filters;
batch_list.AddReplace(“^(.*?)ほっかいどう(.*?)$”,”\\1北海道\\2″,eeFindReplaceRegExp,0);
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);2022年5月26日 7:58 am #30575Yutaka Emuraキーマスターいつもお世話になっております。江村です。
こちらでも再現しましたので、次のバージョンで修正します。
とりあえず eeExFindRegexOnigmo のかわりに eeExFindRegexBoost を使用していただければ、問題は発生しません。よろしくお願いいたします。
2022年5月26日 9:12 am #30577Applek参加者ありがとうございます。
前の連続置換との一括置換の動作の違いを質問させて頂きます。
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
この連続置換のときと違って続けて並べて書くことはできないのでしょうか?以下のようだと北海道までで処理が止まります。
batch_list = editor.filters;
batch_list.AddReplace(“ほっかいどう”,”北海道”,eeFindReplaceRegExp,0);
batch_list.AddReplace(“北海道”,”ホッカイドウ”,eeFindReplaceRegExp,0);
batch_list.AddReplace(“ホッカイドウ”,”太郎”,eeFindReplaceRegExp,0);
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexBoost | eeExFindMulti);以下の場合は、ほっかいどうから始まって、太郎まで変換します。
こんな感じで毎回1処理ずつ囲まないといけなくなりましたでしょうか?よろしくお願いいたします。batch_list = editor.filters;batch_list.AddReplace(“ほっかいど.”,”北海道”,eeFindReplaceRegExp,0);document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexBoost | eeExFindMulti);
batch_list = editor.filters;batch_list.AddReplace(“北海.”,”ホッカイドウ”,eeFindReplaceRegExp,0);document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexBoost | eeExFindMulti);
batch_list = editor.filters;batch_list.AddReplace(“ホッカイド.”,”太郎”,eeFindReplaceRegExp,0);document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexBoost | eeExFindMulti);2022年5月26日 9:51 am #30578Yutaka Emuraキーマスターいつもお世話になっております。江村です。
これが「すべて一括置換」の動作になります。もし違っていたら、私が誤解している可能性があるため、ご質問を明確化していただければ幸いです。
よろしくお願いいたします。
2022年5月26日 10:07 am #30579Applek参加者ありがとうございます。
毎回1個書くごとに毎回閉じないといけない仕様と言うことがわかりました。
その書き方でもトータルで速くなれば良いです。
連続置換だと毎回1個のファイルをやるのに終わるまで10分とかかかります。
おそらく私はEmEditorの使っている人のなかではかなりヘビーな動作をさせているほうだと思います。
ひとつのファルだけでEmEditorでマクロが終わるまで30分以上かかるものが多数あります。
今まで書いたのは、ほとんどの動作はOnigmoでしか動かない\\p{Han}とかの組み合わせコードで書いているので、本格的な動作はまだできない状況です。
よろしくお願いいたします。2022年5月26日 11:15 am #30580Yutaka Emuraキーマスターいつもお世話になっております。江村です。
正規表現の場合は、「すべて一括置換」の動作に、速度上のメリットはありません。むしろ逆に遅くなると思います。「すべて一括置換」で動作が速くなるのは、正規表現ではない単純な文字列を複数使用した場合です。正規表現を一括ではなく連続して実行したい場合は、「すべて一括置換」ではなく「すべて連続置換」を使用してください。
よろしくお願いいたします。
2022年5月26日 11:32 am #30581Applek参加者ありがとうございます。
わかりました。
正規表現は連続置換にします。以前の過去のバージョンアップ記事を読み込むと1回のバージョンアップで速度が何百倍とかに速度アップしている事例が多数ありました。
連続置換自体もまだ速くなる余地はありそうでしょうか?私が気がついている限りでは、前の質問で書いたことと重複しますが、
数十万の置換を並べた場合だと1回で閉じるよりも2000個くらいで一度区切りでそれを繰り返した方がはるかに速くなります。
書き方を変えるだけでも速度が変化しますが、おそらく、これは試行錯誤した人しか気がつかないです。
batch_list = editor.filters;
2000個くらいの置換
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);これくらいに一度閉じてやったほうがかなり速くなります。
このことから、動作のアルゴリズムでユーザーがコードを書いていなくても2000回くらいで区切った扱いとして処理すると1回閉じでも速くなると思います。
よろしくお願いいたします。2022年5月26日 12:15 pm #30582Applek参加者区切り方だけで速度が大きく変わることについては、比較のサンプルマクロが必要でしたら準備して送ります。
これらは、EmEditor側で内部アルゴリズムでコードを把握して自動調整すると最速になると思います。2022年5月26日 11:44 pm #30583Yutaka Emuraキーマスターいつもお世話になっております。江村です。
多数の検索/置換文字列が存在する場合には、その回数だけ AddReplace() を使って一覧を作成するのではなく、リンク ファイルを使用して一度で指定する方が速くなります。ダイアログから指定する方法について、詳しくは、
を参考にしてください。この動作をマクロに記録することができ、以下のように eeExFindLinkFile を使用します。
batch_list = editor.filters; batch_list.AddReplace("E:\\Test\\LinkFile.txt","",eeFindReplaceCase | eeFindReplaceRegExp,eeExFindLinkFile); document.selection.BatchReplace(batch_list,eeReplaceAll,0);
この場合、E:/Test/LinkFile.txt にすべての検索/置換文字列をTabと改行で区切って UTF-8 または UTF-16 で指定します。1個のファイルについてすべて同じ正規表現、大文字小文字を区別などの条件で指定する必要がありますので、正規表現と非正規表現の両方を指定したい場合には、2個のリンク ファイルを用意してください。
よろしくお願いいたします。
2022年5月27日 3:06 am #30584Applek参加者ありがとうございます。
同一ワンパターンの大量データベースを照合させる場合には、リンクファイルの方法が最速であることを理解いたしました。逆に言うと以下のような使い方になる場合はリンクの書き方は向いていないと言うことになるかと思います。
私の場合は、上記の動画の使い方の場合もありますが、正規表現と非正規表現記述の混在した記述が入り交じった状態になります。
また最初は非正規表現である場合であっても、動作の様子を見て正規表現の書き方に付け足すことがあります。
正規表現のパターンは、
batch_list.AddReplace(“\\n”,”⏎”,eeFindReplaceRegExp,0);// シングルライン
batch_list.AddReplace(“⏎”,”\\n”,eeFindReplaceRegExp,0);// シングルラインモード解除
シングルラインモードなどを交えた正規表現パターンは混在です。たとえば事例で言うと
batch_list.AddReplace(“ほっかいどう”,”北海道”,eeFindReplaceRegExp,0);// 非正規表現
この場合は途中から様子を見て
batch_list.AddReplace(“ほっかいどう([^で])”,”北海道\\1″,eeFindReplaceRegExp,0);// 正規表現に変えるこんなふうに部分的にあとから正規表現をつけたしたりすることがよくあります。
こういう混在書き、柔軟な変更をよくする使い方の場合については従来型(リンクではない)の書き方でないと難しいということになりますでしょうか?
そういうことでしたら、リンクでない従来の書き方で最速にして頂けると幸いです。
課題は認識されていても混在型の書き方を速くするのが技術的に難しいとかデメリットがあるから見送っているということが理由でしたらしかたないと思っています。私としては、従来の1個のファイル(リンクでないファイルのほうが)、その都度の編集や変更がしやすいというメリットがあります。
前回の質問でリンクの使い方を回答頂きましたので知ってはいましたが、その都度、頻繁な編集には向いていないので従来型の書き方にしていました。このあたりの内部処理のメカニズムの事情はわからないので質問させていただきました。
ただ、上記の書き方であっても、単純な置換の場合でも、いずれにしても2000個くらいで区切るだけで、かなり速くなったのが検証結果ででていますので、アルゴリズム的に従来型の記述でも速くなると思います。
たとえば2000個以上書かれている場合は内部処理で、一旦閉じて書いて無くても自動的に区切って分割処理するとかです。
それで区切る手間は省けますし速くなります。
1回の処理は最大で2000個までとして、分割処理するというのはどうでしょうか?
これでマクロの記述のほうは省けます。よろしくお願いいたします。
2022年5月27日 10:52 am #30586Applek参加者お世話になっております。
自分で2000個くらいで
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
batch_list = editor.filters;
このように区切りを毎回つけるのでも、速くできますが、この方法だと、データベースを付け足したときに重複削除したときに全部消えてしまう、また再度付け足さないといけない、重複で消えないようにするには、コメントで番号を付けるなどで管理が大変になります。
このことからbatch_list = editor.filters;とdocument.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);は、最低限にして、処理のアルゴリズムのほうで速度を最適化してもらうのがベストだと思います。
よろしくお願いいたします。2022年5月29日 6:32 am #30588Yutaka Emuraキーマスター速度を最重視するのでしたら、リンク ファイルを使用するのが最善の方法です。リンク ファイルを使わないで、検索/置換文字列を1個ずつ追加する方法だと、リンク ファイルほど速くすることはできません。最新版でリンク ファイルを導入した理由が、まさに速度を向上させるためでした。
2022年5月29日 7:37 am #30589Applek参加者ありがとうございます。
最新版で50万行の検証で処理時間の変化を確認してみます。それと別の件ですが、ファイル分割でパスが見付からなかった場合に”指定されたパスが見付かりません”というエラーメッセージがずうっと出続けて、OKをいくら押しても閉じないままになります。
そのため次の動作が出来ないという現象が起きます。
どのパソコンでも再現性があるかはわかりませんが、ご報告致します。
よろしくお願いいたします。2022年5月29日 7:50 am #30590Applek参加者もしかしたら、分割しようとしていたときに作られるファイル数の回数だけずうっとエラーメッセージが繰り返し出続けると言うことかも知れません。
この場合だと何千回もOKを押し続ける必要が生じます。
よろしくお願いいたします。2022年5月30日 2:53 am #30591Yutaka Emuraキーマスターどのパスが見つからなかった場合でしょうか? できるだけ条件を詳しく書いていただけると助かります。また、異なる質問になりますので、別のスレッドで質問していただけると幸いです。
- 作成者投稿
- このトピックに返信するにはログインしてください。