文字列間およびファイルの最初からある文No.34412
T_FIELD さん 15/09/08 09:11
 
お世話になっております。
現在、大容量かつ大量のテキストファイルの加工をしています。
各ファイルは以下のような構造になっています。

先頭
―不必要な数行(1)
ある文字列A
―必要な数行
ある文字列B
―不必要な数行(2)
EOF

この不必要な数行(1)(2)を効率的に削除する方法はありませんでしょうか?更
に贅沢を言えばGrepですべてのファイルを同時に処理したいのですが・・・。

ご教示のほど、よろしくお願い申し上げます。


[ ]
RE:34412 文字列間およびファイルの最初かNo.34413
秀丸担当 さん 15/09/08 11:15
 

簡単には、キー操作の記録と再生を行うといいと思います。
例えば以下のようにします。(標準のキー割り当ての場合)
・Shift+F1で記録開始
・Ctrl+Homeでファイル先頭
・Shift+F6で選択開始
・Ctrl+Fで検索ダイアログを出し「ある文字列A」を下検索
・Deleteで削除
・Ctrl+Endでファイル最後
・Shift+F6で選択開始
・Ctrl+Fで検索ダイアログを出し「ある文字列B」を上検索
・Deleteで削除
・Shift+F1で記録終了

記録ができたら、別のファイルを開いて、Shift+F2を押して再生すると、同じ操
作をまとめて行えます。
「ある文字列A」「ある文字列B」を削除の対象に含めるかどうかはわからないで
すが、適切に調整してほしいです。

キー操作の再生を、grepのように全てのファイルに対して処理することは、その
ままではできないです。
やるとしたら、[マクロ]→[キー操作の保存...]でいったんマクロファイルとし
て保存してから、そのマクロを目的に合うように編集するといったことが必要に
なってきます。

[ ]
RE:34413 文字列間およびファイルの最初かNo.34415
T_FIELD さん 15/09/08 18:28
 
 秀丸担当様

T_FIELDです。
ご教示、誠にありがとうございました。
 無事動きました。ありがとうございます。

>やるとしたら、[マクロ]→[キー操作の保存...]でいったんマクロファイルとして保
>存してから、そのマクロを目的に合うように編集するといったことが必要になって
>きます。

もし可能でしたら、この点についてもご指導いただけないでしょうか?
※macファイルとして保存してあります。batファイルみたいなものを作ればいいとは
思うのですが、不得手でして・・・。
あるいは参考となるHPをお示しいただけないでしょうか?
ご厚情賜りたくよろしくお願い申し上げます。

[ ]
RE:34415 文字列間およびファイルの最初かNo.34416
山紫水明 さん 15/09/08 21:02
 
 T_FIELDさん,

>※macファイルとして保存してあります。batファイルみたいなものを作ればい
>いとは思うのですが、不得手でして・・・。

 先ずは「マクロ」→「マクロ実行」で,この保存されているマクロファイルを
動かせるかどうか試されたらいかがでしょう。
 うまくいけば次は「マクロ登録」に進みます。

                    山紫水明
                    SANSHISUIMEI

[ ]
RE:34416 文字列間およびファイルの最初かNo.34417
T_FIELD さん 15/09/08 23:40
 
山紫水明様

T_FIELDです。
コメントいただき誠にありがとうございます。

> 先ずは「マクロ」→「マクロ実行」で,この保存されているマクロファイルを動
>かせるかどうか試されたらいかがでしょう。
> うまくいけば次は「マクロ登録」に進みます。

先ほど「マクロ登録」まで完了しました。
実はファイルが200以上ありまして・・・。
200回ショートカットを押さずに済む方法を知らず、おすがりする次第です。

ご教授の程、よろしくお願い申し上げます。

[ ]
RE:34417 文字列間およびファイルの最初かNo.34418
秀丸担当 さん 15/09/09 10:05
 

grepしてファイル一覧を出し、そのファイルに対して行うとしたら、例えば以下
のような感じになります。
「//ここから」「//ここまで」の間にキー操作の記録をした内容を貼り付けます。

保存が伴うので、安全のために問い合わせを出していますが、必要なければ
questionの判定は取り除いていいと思います。(ただし適切な場所やファイルを
指定しているか注意が必要です)

setcompatiblemode 0x20000;
$keyword="ある文字列A"; //任意に指定
$folder="c:\\folder";   //任意に指定
$files="*.txt";         //任意に指定
grep $keyword,$files,$folder,filelist;  //必要であれば ,subdir
#h=hidemaruhandle(0);
gofiletop;
while(1){
  searchdown2 "^.+(?=\\([0-9]+\\))",regular
  if(result==false)break;
  openfile "/n " + gettext(foundtopx,foundtopy,foundendx,foundendy);
  #h2=hidemaruhandle(0);
  #f=false;
 
  //ここから
    setcompatiblemode 0x0F;
    gofiletop;
    beginsel;
    searchdown2 "ある文字列A" , hilight;
    if( ! result )  beep;
    delete;
    gofileend;
    beginsel;
    searchup2 "ある文字列B" , hilight;
    if( ! result )  beep;
    delete;
  //ここまで
 
  if(updated){
    question "保存しますか?";
    if(result==yes){
      save;
      #f=true;
    }
  }
  setactivehidemaru #h;
  closehidemaruforced #h2;
  golineend2;
  if(#f){
    insert "●このファイルを保存しました";
  }
}
clearupdated;

[ ]
RE:34418 文字列間およびファイルの最初かNo.34420
T_FIELD さん 15/09/09 13:37
 
秀丸担当様

T_FIELDです。
ご回答ありがとうございます。

頂いたマクロですが、

フォルダ名:C:\Users\main\Documents\仕事\temp
ファイル名:AAA.txtとBBB.txt
検索語句 :悩んでます
であるときに

setcompatiblemode 0x20000;
$keyword="悩んでます";
$folder="C:\Users\main\Documents\仕事\temp";
$files="*.txt";
grep $keyword,$files,$folder,filelist;  //必要であれば ,subdir

とすると「C:\Users\main\Documents\仕事\tempへのカレントフォルダの移動に失敗
しました。マクロを中断します」とでてしまします。

どこが間違っているのでしょうか?
※Sfolder="C:\\folderのところの\\でしょうか?
※なおマクロフォルダは秀丸のフォルダと離れたところにあります。
(Hidemaruフォルダに移動できませんでした。)

大変申し訳ありませんが、ご教示の程、お願い申し上げます。


[ ]
RE:34420 文字列間およびファイルの最初かNo.34421
T_FIELD さん 15/09/09 13:55
 
秀丸担当様

T_FIELDです。
自己レスで申し訳ありません。
さきほどの質問、解決しました。

>$folder="C:\\Users\\main\\Documents\\仕事\\temp";

としたら動きました(考えてみたら当たり前ですが・・・さっきまで思いつきません
でした)。
まだ最終目標まで至っていないので、またご面倒をおかけするかもしれません。今後
ともよろしくお願い申し上げます。



[ ]
RE:34421 文字列間およびファイルの最初かNo.34424
秀丸担当 さん 15/09/09 15:50
 

すみません。説明が不足していました。
おっしゃる通り、マクロの文字列中の\は\\と書く必要があります。
改行を表す場合は「\n」、「"」そのものを表す場合は「\"」というようにマク
ロ中の文字列では\は特殊な扱いになっていて、「\」そのものを表す場合は
「\\」と書きます。

[ ]
RE:34424 文字列間およびファイルの最初かNo.34435
T_FIELD さん 15/09/12 09:38
 
T_FIELDです。
御礼遅くなりました。

おかげさまで、所定の作業を終えることができました。
本当にありがとうございました。
厚く御礼申し上げます。
今後ともよろしくお願い申し上げます。



[ ]