- ベストアンサー
テキストデータの解析
ユーザが操作したデータの解析を行っています。 データを秀丸で開き、コマンド一覧表(CSV)約1000行から 日本語名を手入力してます。 ユーザが操作したデータ(LOG)は↓のイメージです。 データ量は、10MB~1000MB(10万行~ ------------------------------ Command001 ~~~~~~(詳細) Command002 ~~~~~~(詳細) Command003 ~~~~~~(詳細) ------------------------------ 手入力しているのは、コマンド一覧表から日本語名を 一行下に追記する「//切り取り」「//コピー」などと入力 ↓がイメージです。 ------------------------------ Command001 //コピー ~~~~~~(詳細) Command002 //貼り付け ~~~~~~(詳細) Command003 //切り取り ~~~~~~(詳細) ------------------------------ 秀丸とコマンド一覧表(CSV)を使って、この作業を自動化出来ないでしょうか。 よく使うコマンドは、秀丸のキー操作を使って行っていますが どうしても漏れが出てしまい、正確な解析が出来ません。 LOGをWORDに貼り付けて、置換マクロを組んでみましたが案の定 「置換」なので、Command001が「//コピー」となってしまいます。 どなたかアドバイスお願いします。 もしくは、こんなソフトお勧めがありましたら教えて下さい
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。#4です。 > >前提条件 > >コマンド文字列は、行の先頭から記述されているものとします。 > の箇所で、「行の先頭」から記述されていない箇所がありました。 この内容より、コマンド文字列は、行の途中から始まる場合もあるという事と、 > CSVサンプル(ここから)>約1000行 > ------------------- > Command001,//コピー > Command002,//貼付 > Command003,//切り取り > Command004,//新規作成(ファイル) > ------------------- > CSVサンプル(ここまで) この内容より、挿入文字列には、既に"//"が含まれているという事ですので、 上記の条件を考慮して、下記のようにマクロの修正を行ってみて下さい。 これで、対応可能かと思います。 ■マクロの修正部分 注)マクロソースにコピペする際は、全角スペースをタブor半角スペースに置換して下さい。 <変更前> //置換処理(正規表現による置換を行う) $strSrch = "(^" + $strCmd + ".*)$"; //検索文字列 $strRepl = "\\1\n//" + $strIns; //置換文字列 replaceallfast $strSrch, $strRepl, regular; //置換実行 <変更後> //置換処理(正規表現による置換を行う) $strSrch = "(" + $strCmd + ".*)$"; //検索文字列...(※行頭を意味する"^"を削除) $strRepl = "\\1\n" + $strIns; //置換文字列...(※"//"を削除) replaceallfast $strSrch, $strRepl, regular; //置換実行 ■注意事項 ログファイルの記述で、1行に種類の違う複数のコマンドが記述してあった場合、 例えば、下記のような記述の場合、 Command001 ~~~~~~ Command002 ~~~~~~ xxxx Command003 xxxx Command001 xxxx ←1行に違うコマンド記述が複数ある場合 ~~~~~~ マクロでの置換結果は以下のようになります。 Command001 //コピー ~~~~~~ Command002 //貼付 ~~~~~~ xxxx Command003 xxxx Command001 xxxx //切り取り ←このようにそれぞれのコマンドに対する //コピー 挿入文字列が付加されます。 ~~~~~~ 以上です。
その他の回答 (4)
こんにちは。 今回の自動置換を行うための、秀丸エディタ用のマクロを作成してみました。 宜しければ、試してみて下さい。 ■前提条件 1)ログファイル(LOG)の形式について コマンド文字列は、行の先頭から記述されているものとします。 (コマンド文字列の前にスペースorタブなどが入っていないものとします) 2)置換テーブルファイル(コマンド一覧表ファイル)の形式について 置換に使用する、コマンド一覧表ファイル(CSV)(※以下、置換テーブルファイルとします) の形式は、以下のようなものとします。 '==コメント== コマンド文字列,挿入文字列 : : コマンド文字列,挿入文字列 ※コマンド文字列の大文字/小文字は区別します。 ※行先頭が ' (アポストロフィ)で始まる行はコメント行とします。 ※空白行は無視します。 ※区切り文字 "," の前後には、スペースorタブを入れないものとします。 ■使い方 1)マクロファイルを保存します。 下記のマクロソースをコピペして、拡張子を .mac として適当な名前を付けて、 秀丸エディタがあるフォルダに保存して下さい。 秀丸エディタの設定で、「マクロ用フォルダ」を指定している場合は、そのフォルダ に保存して下さい。 注)保存する前に、全角スペースをタブor半角スペースに一括置換して下さい。 2)マクロをメニューに登録します。 秀丸エディタを起動して、 メニュー: マクロ → マクロ登録 で表示された「マクロ登録」ダイアログで空いているエリアに、適当なタイトルを 付けて1)で保存したマクロファイルを登録して下さい。 3)秀丸エディタで編集元のログファイルを開いて下さい。 4)マクロを起動します。 メニュー: マクロ → 2)で登録したマクロのタイトル をクリックしてマクロを起動します。 5)置換テーブルファイルを開きます。 ファイルオープンのダイアログが表示されますので、ここで置換テーブルファイルを 指定して開いて下さい。 6)置換実行の確認。 置換実行を確認するメッセージボックスが表示されますので、置換を実行する場合 は、「はい」をクリックして下さい。 ※これで置換が実行されます。 ※置換完了後は、『x個の置換を行いました。』というメッセージボックスが表示され ますので、[OK]ボタンをクリックして下さい。(これでマクロが終了します) 7)置換後のログファイルを保存します。 置換後のログファイルは自動保存しませんので、必要ならば「上書き保存」などの 保存操作を行って下さい。 ■マクロソース 注)下記ソースには、インデントのため全角スペースを入れています。 ファイルに保存する際は、全角スペースをタブor半角スペースに置換して下さい。 //////↓ここから////// //================================================ //コマンド文字列の一括置換マクロ // //■置換テーブル(CSV)の形式 // コマンド文字列,挿入文字列 // : : // コマンド文字列,挿入文字列 // // ※コマンド文字列の大文字/小文字は区別する。 // ※行先頭が ' で始まる行はコメント行とする。 // ※空白行は無視する。 // ※区切り文字 "," の前後には、スペースorタブを // 入れないものとする。 // //■置換パターン // 検索文字列= (^{コマンド文字列}.*)$ // 置換文字列= \1\n//{挿入文字列} //================================================ //現在の秀丸の検索設定状態を保存 $sv_srchBuf = searchbuffer; #sv_srchOpt = searchoption; //編集元ファイルのファイル名取得 $edf_dir = directory; //フォルダ名 $edf_nm1 = filename; //フルパスのファイル名 $edf_nm2 = basename; //ファイル名 #hh0 = hidemaruhandle(0); //編集元ファイルのハンドルを取得 //置換テーブルファイルをオープンする $tbf_dir = directory; //フォルダ名の初期値 $tbf_nm2 = "*.csv"; //ファイル名の初期値 $tbf_nm1 = $tbf_dir + "\\" + $tbf_nm2; //フルパス名の初期値 readonlyopenfile $tbf_nm1; //ファイルオープンダイアログを表示 if(result == false){ //ファイルオープン失敗時はマクロ終了 setactivehidemaru #hh0; //編集元ファイルをアクティブにする endmacro; //マクロ終了 } //置換テーブルファイルのファイル名取得 $tbf_dir = directory; //フォルダ名 $tbf_nm1 = filename; //フルパスのファイル名 $tbf_nm2 = basename; //ファイル名 $tbf_ftype = filetype; //ファイルタイプ #hh1 = hidemaruhandle(0); //置換テーブルファイルのハンドルを取得 #t_lastline = linecount2; //行数を取得 gofiletop; //ファイル先頭に移動 setactivehidemaru #hh0; //編集元ファイルをアクティブにする escape; //範囲選択を取り消し gofiletop; //ファイル先頭に移動 //ファイルオープンで[キャンセル]の時(=ファイル名が"無題")はマクロ終了 if($tbf_ftype == "new"){ closehidemaruforced #hh1; //置換テーブルファイルをクローズする endmacro; //マクロ終了 } //置換実行の確認 question "置換を実行しますか?"; if(result != yes){ //キャンセル? closehidemaruforced #hh1; //置換テーブルファイルをクローズする endmacro; //マクロ終了 } #rep_cnt = 0; //置換個数の初期化 //置換処理(置換テーブル分を全置換するまでループ) while(1){ //置換テーブルファイルをアクティブにする setactivehidemaru #hh1; //置換テーブルより1行読込み #t_lineno = lineno; //現在行の行番号を取得 #len = linelen2; //現在行の文字数を取得 //現在行の1行分を取得 $strLine = gettext2(0, #t_lineno, #len, #t_lineno, 0); $strWk1 = leftstr($strLine, 1); //先頭1文字を取得 #pos1 = strstr($strLine, ","); //区切り文字の検索 //空白行 or コメント行 or 区切り文字なし の場合は次行へ if(#len<1 || $strWk1=="'" || #pos1<0){ if(#t_lineno >= #t_lastline){ break; //最終行ならループを抜ける }else{ golinetop2; down; //次行の先頭に移動 continue; //次処理へ } } //コマンド文字列、挿入文字列を取得 $strCmd = leftstr($strLine, #pos1); $strIns = midstr($strLine, #pos1+1, #len-(#pos1+1)); //編集元ファイルをアクティブにする setactivehidemaru #hh0; gofiletop; //ファイル先頭に移動 //置換処理(正規表現による置換を行う) $strSrch = "(^" + $strCmd + ".*)$"; //検索文字列 $strRepl = "\\1\n//" + $strIns; //置換文字列 replaceallfast $strSrch, $strRepl, regular; //置換実行 if(result > 0){ #rep_cnt = #rep_cnt + result; //置換個数の更新 } //置換テーブルファイルをアクティブにする setactivehidemaru #hh1; //最終行だったらループを抜ける if(#t_lineno >= #t_lastline){ break; } //次行の先頭に移動 golinetop2; down; } //編集元ファイルをアクティブにする setactivehidemaru #hh0; gofiletop; //ファイル先頭へ移動 //秀丸の検索設定状態を復元 setsearch $sv_srchBuf, #sv_srchOpt; //置換テーブルファイルをクローズする closehidemaruforced #hh1; //置換完了メッセージの表示 $msg = str(#rep_cnt) + "個の置換を行いました。"; message $msg; //マクロ終了 endmacro; //////↑ここまで////// 【補足】 1)上記のマクロは、秀丸エディタのバージョンがVer 7.00以上を想定しています。 2)置換処理で検索文字列の大文字/小文字を区別したくない場合は、ソース内の下記の行 を以下のように変更して下さい。 変更前: replaceallfast $strSrch, $strRepl, regular; //置換実行 変更後: replaceallfast $strSrch, $strRepl, regular, nocasesense; //置換実行 3)マクロ機能の詳細については、秀丸エディタのヘルプ(マクロヘルプ)をご覧下さい。 以上です。参考になれば幸いです。 もし、お使いの環境で上手く動作しなかった場合は、すみません。 また、目的の動作と違っていた場合は、マクロを修正してみて下さい。
お礼
レスおよび大変参考になるマクロまで記載して頂きありがとうございます。 >前提条件 >コマンド文字列は、行の先頭から記述されているものとします。 の箇所で、「行の先頭」から記述されていない箇所がありました。 なんとか記載いただいたマクロを確認しながら、修正していきたいと 思います。ありがとうございました。
#1です。前回の回答は冗長だった。他のやりかたも考えてたので、それと関連してちょっと書きすぎました。回答とすれば#2さんの内容で必要十分です。 さて、ログの内容ですが、 > Command001の後にも文字列がある行があるので > 改行コードが入ると困る事になりました。 これは可能性として考えていましたが、サンプルではよくわからなかったので前回はふれませんでした。ログとCSVのサンプルがあればアドバイスできるかもしれないです。自己解決が難しいようなら補足してください。
補足
2度にわたりレス感謝です。 ログサンプル(ここから)>全角スペース無/2バイト文字無 ------------------- Command001 ~~~~~~ Command002 ~~~~~~ Command003 ~~~~~~ xxxxxx Command004 xxxxxxxx ~~~~~~ ------------------- ログサンプル(ここまで) CSVサンプル(ここから)>約1000行 ------------------- Command001,//コピー Command002,//貼付 Command003,//切り取り Command004,//新規作成(ファイル) ------------------- CSVサンプル(ここまで) こんな具合です、#4さんが、マクロを公開して頂いたので そちらを参考に確認してみたいと思います。 レスありがとうございました。
- fujillin
- ベストアンサー率61% (1594/2576)
>「置換」なのでCommand001が「//コピー」となってしまいます。 多分、「Command001」を「//コピー」に置換しているのではないかと思いますが、 「Command001」を「Command001+(改行コード)+//コピー」に置換すればよいのでは?
補足
レスありがとうございます。 Command001の実行したログに、 Command001(改行せず)~~~~詳細 がある行がありました。 置換で改行してしまうとちょっと困る事になります。 ですが、置換で改行コードを入れる事が出来るということなので 別の機会に参考にさせていただきます。 ありがとうございました。
例として次のlogがあったとしよう。 Copy 詳細foo Paste 詳細bar Cut 詳細hoge Paste 詳細piyo CSVファイルの詳細は不明だが、仮に次のような内容だと考える。 Copy,コピー Paste,貼り付け Cut,切り取り Wordのメニューで「編集-置換」を使用するなら正規表現に似た記法が使える(参考URLに説明があります)。次の検索文字列と置換文字列を指定してみよう。 検索文字列: (Paste^13) 置換文字列: \1//貼り付け^13 「ワイルドカードを使用する」にチェックを入れて置換すると次のようになる。 Copy 詳細foo Paste //貼り付け 詳細bar Cut 詳細hoge Paste //貼り付け 詳細piyo 同じ機能を使ってWordマクロを組んだのなら、少し修正するだけでいけるかもしれない。しかし、現在のマクロがどんなものか不明なので今回の回答はこれまでにしておく。 上記はWord2000/Win2000で確認しました。 補足:WSH-VBSでのやり方も考えた。というかもう作っちゃったけど、長くなるので今回は載せない。興味があったら補足してください。
お礼
レスありがとうございます。 腕がないので、Wordの置換マクロでなんとかなりそうですが 教えていただいた内容を修正して 検索文字列>Command001 置換文字列>Command001(改行コード)//コピー となっていますが、Command001の後にも文字列がある行があるので 改行コードが入ると困る事になりました。 プログラム?のイメージとしては、LOGの検索文字列を CSVの一番左(EXCELで開くとA列)から引っ張って LOG内を検索し、検索文字列があったら、B列の内容の行末を改行し コピーする感じと言えばいいでしょうか。 それでも大変参考になりました。ありがとうございます。
お礼
レスありがとうございます。 掲載していただいたマクロを修正しておりました。 思ったように動かず、分からなかった部分補足いただき 本当ありがとうございます。 修正/起動確認などしていたらすでに3時過ぎ レスいただいたので、もう少し頑張りたいところですが ほっとしたところで急な眠気に襲われ今日は床につきたいと 思います。