必要な行のみコピーして新しいファイルをNo.18310
abe_mashu さん 04/11/10 03:22
 
はじめまして。初心者です。

同じ書式が繰り返される計算結果から、必要な複数行を取り出して新しいファイルを
作る方法について教えてください。

必要箇所をサーチして行ごとクリップボードにコピーしようとして

  clearcliphist;
  gofiletop;
A:
  searchdown "***" , regular;
  if(result ==no)
    goto B;
  else
    selectline;
    appendcopy;
    searchdown "###" , regular;
    selectline;
    appendcopy;
    (中略)
    goto A;
B:
  newfile;
  paste;
  clearcliphist;

としてみました。clearcliphistを前後二回やっているにもかかわらず、前回のクリ
ップボードのデータが残ってしまいます。
過去ログを見ると秀丸以外のソフトのクリップボードの情報も入るかもしれないよう
で、これは仕方ないことのように見えますが、正しいでしょうか?

また、クリップボードにコピーするのではなくて、
 (1)ファイル1でサーチして
 (2)ファイル1からコピーして
 (3)ファイル2に貼り付け(appendcopy)て
 (4)(1)にもどる
   (以下繰り返し)
ということができるといいのですが、うまい方法はないでしょうか。

以上2点、御指導お願いします。

また、

[ ]
RE:18310 必要な行のみコピーして新しいフNo.18311
アルビレオ さん 04/11/10 07:31
 
秀丸ユーザーのアルビレオです。

>clearcliphistを前後二回やっているにもかかわらず、前回のクリ
>ップボードのデータが残ってしまいます。

clearcliphistは「クリップボード履歴」を消去するもので、クリップボードの
内容は消去しません。

>過去ログを見ると秀丸以外のソフトのクリップボードの情報も入るかもしれないよう
>で、これは仕方ないことのように見えますが、正しいでしょうか?

他のソフトでカットやコピーをした内容がテキストであれば履歴に入ります。
1ユーザーの想像ですが、こうしておかないとたとえば他のソフトでテキストを
コピーして秀丸で「貼り付け+履歴戻し」を実行したときにおかしなことになり
そうですよね。

>また、クリップボードにコピーするのではなくて、
> (1)ファイル1でサーチして
> (2)ファイル1からコピーして
> (3)ファイル2に貼り付け(appendcopy)て
> (4)(1)にもどる
>   (以下繰り返し)
>ということができるといいのですが、うまい方法はないでしょうか。

もっと発想を変えて、grepを使って***と###だけを抽出、対になっていな
い部分を削除してからファイル名と行番号を消してみたらどうでしょう?
クリップボードを使わずにできるし、たぶんこうした方が高速です。

//該当行を抽出
$fanme = basename;
grep "(***)|(###)",$fname,".",regular;
//対になっていない部分を削除
gofiletop;
//ループ先頭
next:
beginsel;
searchdown "***" , regular;
if(result ==no) goto end;
golinetop2;
delete;
movetolineno 1,lineno+1;
beginsel;
searchdown "###" , regular;
golinetop2;
delete;
movetolineno 1,lineno+1;
goto next;
//ループ終わり
end:
gofileend;
delete;
//ファイル名と行番号を削除
replaceallfast "^[^:]+\\): ","",regular;

[ ]
RE:18310 必要な行のみコピーして新しいフNo.18315
秀丸担当 さん 04/11/10 16:00
 

>としてみました。clearcliphistを前後二回やっているにもかかわらず、前回のクリ
>ップボードのデータが残ってしまいます。
>過去ログを見ると秀丸以外のソフトのクリップボードの情報も入るかもしれないよう
>で、これは仕方ないことのように見えますが、正しいでしょうか?

アルビレオさんも言われている通り、clearcliphistはクリップボード履歴を消
去するだけで、現在のクリップボードの内容は消去しません。
クリップボードの内容を消去するには、
setclipboard "";
とするといいと思います。

>また、クリップボードにコピーするのではなくて、
> (1)ファイル1でサーチして
> (2)ファイル1からコピーして
> (3)ファイル2に貼り付け(appendcopy)て
> (4)(1)にもどる
>   (以下繰り返し)
>ということができるといいのですが、うまい方法はないでしょうか。

setactivehidemaruで、ウィンドウを切り替えながらするとできます。

#h1 = hidemaruhandle( 0 );
newfile;
#h2 = hidemaruhandle( 0 );

として2つのウィンドウハンドルを得ておき、

setactivehidemaru #h1;

というようにするとウィンドウを切り替えできます。

ちなみに if文の後は以下のように、 {}でくくるといいです。
  if(result ==no) {
    goto B;
  } else {
    selectline;
    appendcopy;
    searchdown "###" , regular;
    selectline;
    appendcopy;
    (中略)
    goto A;
  }

{}が無いと、ifやelseの後の一文しか実行されません。
goto文によって問題なく動いているようですが、実際の動きは以下にようになっ
てしまっています。

  if(result ==no) {
    goto B;
  } else {
    selectline;
  }
  appendcopy;
  searchdown "###" , regular;
  selectline;
  appendcopy;
  (中略)
  goto A;

[ ]
RE:18310 必要な行のみコピーして新しいフNo.18320
abe_mashu さん 04/11/10 23:35
 
アルビレオさん、秀丸担当さん
早速教えていただいてありがとうございました。

必要行の取り出しだけから行けば、grepで簡単にできることには気がついていたので
すが、(grepも初学者です)

A1 A2 A3
B1 B2 B3
C1 C2 C3
D1 D2 D3

の繰り返しデータから、例えばA2をy軸、B3をx軸、また別の組み合わせでA3をy軸、B
3をx軸として取り出したいときに、まずは

A1 A2 A3
B1 B2 B3

を取り出すマクロを作って、さらにここから

B2 A2 A3

と並べ替えるマクロを作りたかったので、grepの勉強を始める傍らで、秀丸でなんと
かしたかった次第です。

また、秀丸担当さんの言われる
setclipboardやウインドウ切り替え法
の使い方は知りませんでした。

基本的な構文も教えていただいてありがとうございます。

[ ]