フォーラムの返信を作成しました。
- 作成者投稿
- Applek参加者
お世話になっております。
上記の件を汎用化して要望しますと削除だけでなく、特定範囲に対する正規表現や一括置換を簡単に範囲を指定するだけで書けるようにしてもらいたいという機能です。事例サンプル
あああああ◎←これは変更させません
いいいいい◎←これは変更させません☆←この範囲の◎だけ▼に変更
青森◎
秋田◎
岩手◎
★←この範囲の◎だけ▼に変更ううううう◎←これは変更させません
えええええ◎←これは変更させませんまず範囲指定のコードで☆~★の最短一致の範囲指定のコードを記述
batch_list.AddReplace(“◎$”,”▼”,eeFindReplaceRegExp | eeFindReplaceCase,0);// ☆から★の間にある◎$のみを▼に変更する
範囲指定を閉じるコードこのように2~3行で書けるようにしてもらいたいです。
従来の正規表現だと、そのまま書くと文書全体にまるごと適応されて全部変更されるので範囲指定内で変更したい場合は以下のようにする必要がありました。batch_list.AddReplace(“\\n”,”⏎”,eeFindReplaceRegExp,0);// シングルラインモード
for( i = 0; i < 200; ++i )
batch_list.AddReplace(“(☆[^⏎]*?)◎⏎(.*?★)”,”\\1▼⏎\\2″,eeFindReplaceRegExp | eeFindReplaceCase,0);
batch_list.AddReplace(“⏎”,”\\n”,eeFindReplaceRegExp,0);// シングルラインモード解除この機能が追加されると範囲内のみ指定した範囲だけで普通の正規表現や一括置換で記載して一回で置換できます。
もしかしたら既に機能があって、私が気がついていないだけかも知れません。
よろしくお願いいたします。Applek参加者範囲内の指定文字や改行を一括削除できる機能と対象がなかった時点で正規表現をストップする機能
タイトルが短くなりました。
よろしくお願いいたします。Applek参加者お世話になっております。
ScriptFullName.substr( 0, ScriptFullName.lastIndexOf( “\\” ) ) + “\\カタカナへ変換.txtこれで書きますとリンクが利かなくなっていました。
#include “”のときのようにリンクを利くようにしてもらいたいです。これですと、メンテする度に、開くからファイルを開かないといけなくなります。
通常の#include “”のときのように、マクロのフォルダのまま認識する仕様変更になりませんでしょうか?
上記のような書き方は通常の相対パスと違うため特別に教えてもらった人しか書くのは無理だと思います。よろしくお願いいたします。
Applek参加者お世話になっております。
単語のみ検索するにしても、長い行が優先される効果は、なかったようです。
一括置換で〝長い方を優先する〟という機能はつけてもらえませんでしょうか?それとも分離して長い方を先にやるしかないでしょうか?
よろしくお願いいたします。Applek参加者こちらにありました。すみません。
https://www.emeditor.org/ja/cmd_search_findbar_only_word.html
[単語のみ検索する (検索ツール バー)] コマンド
概要
検索ツール バーの [単語のみ検索する] ボタンのオン/オフを切り替えます。説明
検索ツール バーの [単語のみ検索する] ボタンのオン/オフを切り替えます。実行方法
•既定のメニュー: なし•すべてのコマンド: [検索] – [検索ツール バー] – [単語のみ検索する]
•ツール バー: find_only_word (検索ツール バー)
•ステータス バー: なし
•既定のショートカット: なし
プラグイン コマンド ID
•EEID_FINDBAR_ONLY_WORD (4576)マクロ
[JavaScript]
editor.ExecuteCommandByID(4576);[VBScript]
editor.ExecuteCommandByID 4576Applek参加者お世話になっております。
>[単語のみ検索する] が設定されている場合には、この限りではありませんが、遅くなります。
設定は出来るが、遅くなりますという回答になりますでしょうか?
その場合はどれくらい遅くなりますでしょうか?通常のdocument.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);よりは速いでしょうか?
EmEditor側の設定ではなく、そのマクロの時だけそのように動作させるのをマクロで記述することは可能でしょうか?よろしくお願いいたします。
Applek参加者ご回答ありがとうございます。
動きました。これで従来のインクルードと同様に出来まして便利です。ありがとうございます。●競合するときは、文字数が長いほうを優先するという設定の要望は、可能でしょうか?
それとも分離して動作させるしかないのでしょうか?よろしくお願いいたします。
Applek参加者ご回答ありがとうございます。
>EmEditor.exe の存在するフォルダからの相対パスになります。
インクルードのときは、マクロと同じフォルダでいけましたが、今回も同様になりませんでしょうか?
メンテの問題で、マクロと同一フォルダで以下のように書きたいです。
batch_list.AddReplace(“カタカナへ変換.txt”,””,eeFindReplaceCase | eeFindReplaceRegExp,eeExFindLinkFile);よろしくお願いいたします。
Applek参加者お世話になっております。
インクルードのときは、マクロが同じフォルダにあれば、
#include “カタカナへ変換.jess”
このように書くと動作したのですが、batch_list.AddReplace(“カタカナへ変換.txt”,””,eeFindReplaceCase | eeFindReplaceRegExp,eeExFindLinkFile);
一括置換のリンクは、このように書くだけで相対パス扱いにはならないのでしょうか?
あるのに見つからないと出ます。よろしくお願いいたします。
Applek参加者ご回答ありがとうございます。
リンクファイルタブ区切りだと440万候補が2秒くらいで置換できてます。ありがとうございます。
〝競合する候補があるときは長い方を優先する〟という機能を付けてもらいたいです。そうしないと長い候補からリンクファイルを分離して作らないといけないので、メンテがかなりの負担になります。
一旦document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo | eeExFindMulti);とかで閉じるだけで別の書き方に変えれる混在書きができるようにしたいのです。以下のようにマクロのファイルだけで普通の置換のときのように作れましたら、
一旦、document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo | eeExFindMulti);で閉じるということをやって区切れば、優先順位が付けられて、いけますが、リンクでないと動作しないとなると、いちいち複数ファイルで管理していかないといけなくなりますので実用的ではないです。
一発つくればメンテ不要の場合だと今のEmEditorのやり方でもできますが、たいていは、使う度にメンテします。莫大な候補をひとつのマクロファイルで書いてやるより、かなり手間がかかります。
このようなメンテナンス上の難になる理由があるためにひとつのファイルにbatch_list.AddReplace(“”,””,eeFindReplaceRegExp | eeFindReplaceCase,0);この形式で従来通りに一括置換も書きたいのです。>その通りです。[単語のみ検索する]、その他のオプションが設定されていない場合、長い方の文字列は無視されます。
これは一旦document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo | eeExFindMulti);で閉じて区切れば解決しますので、マクロファイルに直接書く必要があります。
このやり方で少ない項目(7万行くらい)だとこれで普通に動作して閉じるだけで混在書きもできて通常動作していますがマクロが数百万候補になると砂時計のまま止まります。
通常の書き方と同じように一瞬で動いてもらいたいです。
通常の従来の書き方でひとつのファイルで管理できるほうがメンテがラクです。一括同じリンクファイルで長いほうか短いほうを優先されるかは選択できるようになりませんでしょうか?
以下のような書き方でも動作はしていますので砂時計待ちがなくなるだけでいけます。
batch_list = editor.filters;
batch_list.AddReplace(“あおもり”,”青森”,eeFindReplaceRegExp | eeFindReplaceCase,0);
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo | eeExFindMulti);このような書き方で大量に書いた場合にマクロが砂時計になって止まるというメールでsampleで送らせて頂きました問題は解決しますでしょうか?
大量の候補があるのは、eeExFindMultiでない使い方もあるためです。
リンクだと個々の単語にメンテをしたくなったときの手間が増えます。
途中の行から通常のdocument.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);を混在した書き方も出来ないですが、ひとつのマクロファイルだけで可能なら区切るだけで混在した書き方のメンテナンスができます。
そのような理由のためリンクファイルにしなくても速く動くように御願いしたいのです。
メールで送らせて頂いた書き方で、砂時計待ちにならないようになれば使えます。よろしくお願いいたします。
Applek参加者お世話になっております。
以下のように直接書いても動くようになりませんでしょうか?
よろしくお願いいたします。batch_list = editor.filters;
おーすとらりあ オーストラリア
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo | eeExFindMulti);Applek参加者お世話になっております。
前に教えて頂いた以下のリンクテキストだとすぐ動きました。
リンクではなく、直接マクロファイルに書いたままでは、すぐに動作するのは、無理なのでしょうか?リンクだと相対パスも可能でしょうか?
それと、複数の候補があったうち、長い対象と短い対象があった場合は、どちらが優先されるのでしょうか?
たとえば、”オーストラリア”と”オーストラ”があった場合は、
“オーストラりあ”と変換されます。
短い候補が優先されるということになりますでしょうか?
これは、どちらも候補があったときは短いものを適応すると決まっているのでしょうか?
よろしくお願いいたします。batch_list = editor.filters;
batch_list.AddReplace(“C:\\Test2\\カタカナへ変換.txt”,””,eeFindReplaceCase | eeFindReplaceRegExp,eeExFindLinkFile);
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo | eeExFindMulti);Applek参加者お世話になっております。
https://jp.emeditor.com/emeditor-core/emeditor-v21-6-0-%e3%82%92%e5%85%ac%e9%96%8b%e3%81%97%e3%81%be%e3%81%97%e3%81%9f-%e3%83%86%e3%82%af%e3%83%8b%e3%82%ab%e3%83%ab-%e3%83%ac%e3%83%93%e3%83%a5%e3%83%bc%e3%82%92%e5%90%ab%e3%82%80/
メールでこのページを案内して頂きましたが、この問題の解決方法は、わかりませんでした。
私が理解できていないということでしたら申し訳ございませんでした。
よろしくお願いいたします。Applek参加者お世話になっております。
動かないのは、正規表現ではなく、
batch_list.AddReplace(“あおもり”,”青森”,eeFindReplaceRegExp | eeFindReplaceCase,0);みたいな単純な置換が数百万候補になります。
よろしくお願いいたします。Applek参加者それとマクロ途中のエラーで「正規表現で一致しない(と)が含まれています」などのエラーが出たときは、その行をコピーするというボタンの機能を付けてもらいたいです。
Applek参加者バージョンアップありがとうございました。
Applek参加者ありがとうございます。
もともとそういう仕様上の動きでしたら、納得しました。Applek参加者ありがとうございます。
以下のように出現個数を新規ファイルにするのは出来ますが、新規ではなく、そのままのファイルのまま継続して処理して個数表示するのは可能でしょうか?
よろしくお願いいたします。北海道〘3〙
青森〘2〙
岩手〘1〙Applek参加者editor.ExecuteCommandByID(4041);
マクロは、録画できなくても、これでいけましたが、動作が止まって設定画面が出て別出力するのでは無く、上記のようにそのまま同じ画面で継続する機能がありがたいです。
現在の仕様だと大量のマクロの経過がストップしてしまうためです。
よろしくお願いいたします。Applek参加者いろいろやってみるとフリーズの再現には、特徴がありました。
1行目当たりを表示してマクロを押すと正常に終わりますが、最後の行の140万行目あたりの表示させた状態でマクロを動かすとフリーズするようです。Applek参加者もしかしたら、分割しようとしていたときに作られるファイル数の回数だけずうっとエラーメッセージが繰り返し出続けると言うことかも知れません。
この場合だと何千回もOKを押し続ける必要が生じます。
よろしくお願いいたします。Applek参加者ありがとうございます。
最新版で50万行の検証で処理時間の変化を確認してみます。それと別の件ですが、ファイル分割でパスが見付からなかった場合に”指定されたパスが見付かりません”というエラーメッセージがずうっと出続けて、OKをいくら押しても閉じないままになります。
そのため次の動作が出来ないという現象が起きます。
どのパソコンでも再現性があるかはわかりませんが、ご報告致します。
よろしくお願いいたします。Applek参加者お世話になっております。
自分で2000個くらいで
document.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);
batch_list = editor.filters;
このように区切りを毎回つけるのでも、速くできますが、この方法だと、データベースを付け足したときに重複削除したときに全部消えてしまう、また再度付け足さないといけない、重複で消えないようにするには、コメントで番号を付けるなどで管理が大変になります。
このことからbatch_list = editor.filters;とdocument.selection.BatchReplace(batch_list,eeReplaceAll,eeExFindRegexOnigmo);は、最低限にして、処理のアルゴリズムのほうで速度を最適化してもらうのがベストだと思います。
よろしくお願いいたします。Applek参加者ありがとうございます。勉強になりました。
Applek参加者ありがとうございます。
同一ワンパターンの大量データベースを照合させる場合には、リンクファイルの方法が最速であることを理解いたしました。逆に言うと以下のような使い方になる場合はリンクの書き方は向いていないと言うことになるかと思います。
私の場合は、上記の動画の使い方の場合もありますが、正規表現と非正規表現記述の混在した記述が入り交じった状態になります。
また最初は非正規表現である場合であっても、動作の様子を見て正規表現の書き方に付け足すことがあります。
正規表現のパターンは、
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個までとして、分割処理するというのはどうでしょうか?
これでマクロの記述のほうは省けます。よろしくお願いいたします。
- 作成者投稿