大量の行をマウスを使わずに削除したいNo.25308
IRON28 さん 08/08/22 23:36
 
はじめまして。もう10年以上前に秀丸を買ったものです。計算化学関係の仕事をし
ておりまして、入力データや出力データの編集に秀丸をいつも愛用しております。
 さて、ある計算結果ファイルに書かれた内容(膨大な数の数値)の一部を抜き出し
て次の計算の入力データにするということをしばしばやっているのですが、最近の計
算では抜き出すべき部分があまりにも大量で困っています。つまりこの部分が数千行
から数万行に及ぶのです。これではマウスで範囲指定することが非常に辛い作業にな
ります。余分な部分を消して必要部分だけ残す手もあるのですが、それら余分な部分
もまた数千行から数万行に及ぶのでこれも大変です。
 そこでマウスを使わずに行番号の○○からXXまでを手入力で指定してごっそり削除
できることができれば楽です。これはマクロを作ればできそうな気がしますが、あい
にく私はマクロの作り方を知りません(昔のFORTRANを知っているだけです)。そこ
でマクロを作成していただければありがたいのですが。

[ ]
RE:25308 大量の行をマウスを使わずに削除No.25314
IKKI さん 08/08/23 02:28
 
こんばんは。ユーザの IKKI です。

選択開始コマンドを使えばマウスを使わずに範囲選択できます。

行番号を指定して削除するマクロは、例えば次のようなものになります。

// 行範囲を指定して削除.mac
$$range = input("削除する行範囲を指定してください\n例: 100-199", str(lineno));
##top = val($$range);
##btm = val(midstr($$range, strstr($$range, "-") + 1, 9999));
if (!(##top && ##btm)) endmacro;
movetolineno 1, ##top + (##top > ##btm);
beginsel;
movetolineno 1, ##btm + (##top < ##btm);
delete;

>  さて、ある計算結果ファイルに書かれた内容(膨大な数の数値)の一部を抜き出し
> て次の計算の入力データにするということをしばしばやっているのですが、最近の計
> 算では抜き出すべき部分があまりにも大量で困っています。

ところで、この作業は人間が目視で行うしかないのでしょうか?
必要な範囲を自動的に判断して抜き出すツール(プログラム)を作るのが
正道のような気がしますが…。

[ ]
RE:25314 大量の行をマウスを使わずに削除No.25315
IKKI さん 08/08/23 02:35
 
例示したマクロにバグがありました。こちらが正当です。

// 行範囲を指定して削除.mac
$$range = input("削除する行範囲を指定してください\n例: 100-199", str(lineno));
##top = val($$range);
##btm = val(midstr($$range, strstr($$range, "-") + 1, 9999));
if (!(##top && ##btm)) endmacro;
movetolineno 1, ##top + (##top > ##btm);
beginsel;
movetolineno 1, ##btm + (##top <= ##btm);
delete;

[ ]
RE:25314 大量の行をマウスを使わずに削除No.25320
IRON28 さん 08/08/23 22:25
 
kkIさん
早速にマクロを作成していただき、まことにありがとうございます。
試したところ私の希望通りに作動しました。これで業務がはかどります。
重ねて御礼申し上げます。
 ところでご指摘のプログラムですが、確かにこれも一手かと思いますが、
やはりマクロの方が便利だと思います。使うソフトは秀丸一本で済む方が
楽ですので。そもそも、そういうプログラムは私には作れませんので(^^;。

[ ]
RE:25320 大量の行をマウスを使わずに削除No.25321
IRON28 さん 08/08/23 23:04
 

>楽ですので。そもそも、そういうプログラムは私には作れませんので(^^;。

この返信をアップした後、上記プログラムを考えてみたのですが、なんと次のもので
うまく作動しました(古風な書き方ですが・・・)。

C// 所定の部分を抜き出す。
      CHARACTER*132 LINE
C
      OPEN(5,FILE='INPUT.inp')
      OPEN(6,FILE='OUTPUT.out')
C
100   READ(5,'(A132)')LINE
      IF(LINE.EQ.' $HESS')GO TO 200
      GO TO 100
200   READ(5,'(A132)')LINE
      WRITE(6,'(A132)')LINE
      IF(LINE.EQ.' $END')GO TO 300
      GO TO 200
300   STOP
      END

上記の$HESS記号の直後から$ENDまでの間にあるデータが必要な部分なのですが、こ
れらがうまくOUTPUT.outに取り込めました(今試した例では2555行)。


[ ]
RE:25321 大量の行をマウスを使わずに削除No.25325
ENCODINGSHIFTJIS さん 08/08/25 11:49
 
レトロすぎます、真夏のビックりする話のようです。 という 感想
(最近の FORTRANで書き直すと、どうなるか想像してみました)
--
sedコマンド等では ワンライナー(一行コマンド) の練習問題のレベル
Windowsに Unixコマンド導入とか Win内で動く Unix環境を整備したほうが早いかも
あるいは 使う人が異常に少ない PowerShell(MS純正)とか

[ ]