HTMLファイル内のソート?No.02332
yamasan さん 01/07/08 11:38
 
こんにちは、yamasanと申します。お願いします。
ずっと、どうしようかと考えていたのですが、思い切って、お尋ねします。

私のやりたいことを説明しますと、
よく見に行くPCユーザーの掲示板があって、その過去ログのHTMLファイルを
読みやすいように、自分なりに編集してます。

(ファイル容量は、350KB〜450KBぐらいで、
折り返しを80行の設定で、約7000行ほどです。
同様のファイルが、20ほどあるので、という次第です。)

ファイルの行の先頭の改行は、削除しているのでありません。
(\nのみの行は、ありません。)

ただの過去ログファイルでして、時系列がそのままで、
発言の新しいものほど上にあって、読みにくいので、
ソートしたいといいますか、一番最後のものを一番上に持ってきて、
下から順に上に持って来たいということなんです。

(下記の【例】でお分かり頂けるかどうかなのですが、
投稿日:に続く日時が、下に行くほど、古くなっているというファイルです)

自分なりに、必要と思われる部分を下に書いてみました。

その掲示板の個々の発言は、<HR>のみの行で始まり、
次の<HR>のみの行が始まるまで続きます。
下の【例】のような規則性だけで、
部分的に取り出して入れ替えることができますでしょうか?

その部分だけ取り出して、上から順に、
999.txt,998.txt,…という風に番号を付けてファイルを外部に作成でも、
方法だけといいますか、マクロをお教え願えませんでしょうか?

もしくは、ご面倒でしたら、
こういうことが、可能か否かとかでも、恐縮なのですが、お尋ね申しあげます。


//【例】//
<HR>
<FONT color=#ff0000 size=4><B>"文字列"</B></FONT> 投稿者:<B><A
href=""文字列"">"文字列"</A></B> <FONT size=2> 投稿日:
2月20日(火)18時27分51秒
<!-- Remote Host: "文字列(半角英数字)" --></FONT>
<P>
<BLOCKQUOTE><TT><FONT
  size=3>"文字列・<br>とか改行を複数含む"<!-- form "半角数字9桁" --></FONT><
/TT>  <P></P></BLOCKQUOTE>
<P>
<HR>
<FONT color=#ff0000 size=4>"文字列"<B></B></FONT> 投稿者:<FONT
color=#555555><B>"文字列"</B></FONT> <FONT size=2> 投稿日: 2月20日(火)17時
53分39秒 <!-- Remote Host: "文字列(半角英数字)" --></FONT>
<P>
<BLOCKQUOTE><TT><FONT size=3><!-- form "半角数字9桁" --></FONT></TT>
  <P></P></BLOCKQUOTE>
<P>
<HR>
<FONT color=#ff0000><b>"文字列"</b></FONT> 投稿者:"文字列"
 投稿日:1月14日(日)22時19分01秒
<P>"文字列・<br>とか改行を複数含む"
<P>
<HR>
……
//【例】は、終わりました。//

[ ]
RE:02332 HTMLファイル内のソート?No.02333
TAKA さん 01/07/08 12:13
 
TAKA です。

>ただの過去ログファイルでして、時系列がそのままで、
>発言の新しいものほど上にあって、読みにくいので、
>ソートしたいといいますか、一番最後のものを一番上に持ってきて、
>下から順に上に持って来たいということなんです。

以下のマクロでどうでしょうか?
並べ替えるだけですので、マクロを2回動かせば、元の状態に戻り
ます。

// マクロ(ここから)
    $SearchBuf  = searchbuffer; // 検索条件退避
    #SearchOpt  = searchoption;
    disabledraw;

    // ステルス秀丸上でデータを逆に並べる
    #FH = hidemaruhandle( 0 );
    gofileend;
    openfile "/h";
    #TmpFH = hidemaruhandle( 0 );
    while( 1 )
    {
        setactivehidemaru #FH;
        beginsel;
        searchup "^<HR>", regular;
        if( !result )
        {
            break;
        }
        copy;
        setactivehidemaru #TmpFH;
        paste;
    }

    // ステルス秀丸上のデータを元ファイルに戻す
    setactivehidemaru #TmpFH;
    selectall;
    copy;
    setactivehidemaru #FH;
    selectall;
    paste;
    closehidemaruforced #TmpFH;

    setsearch $SearchBuf, #SearchOpt;   // 検索条件復帰
    enabledraw;
    endmacro;
// マクロ(ここまで)

[ ]
RE:02333 HTMLファイル内のソート?No.02334
yamasan さん 01/07/08 20:08
 
TAKAさん、ありがとうございました。yamasanです。

 | 以下のマクロでどうでしょうか?
 | 並べ替えるだけですので、マクロを2回動かせば、元の状態に戻り
 | ます。

手元のファイルに対して、マクロを実行しました。
完璧です。私の言っていることを完全に把握していただいたようです。

どうして、こんなことができるんですか?
おせ〜て。(本当に教えてもらいたいです。)
ステルス秀丸とか、分かりません。悲しい(T_T)。
マクロの記述を見ても、分からないのですよねぇ。

確かに、ステルスです。隠れて処理してますもの。
しかし、このマクロを実行していると、PCが動いている感じです。
素晴らしい。グレィトです。(かなりリソースを食う感じです。)

私的には、任意の改行数を含む検索・置換というのが、
できるというのが、すごいと思えます。
これが、操れるようになれると、
いろいろと、私の出来ないことが出来るようになるのですが。

TAKAさん、本当にありがとうございました。私も精進したいです。
失礼しました。とりあえず、上手くいったという報告です。

[ ]
RE:02334 HTMLファイル内のソート?No.02335
TAKA さん 01/07/08 21:12
 
TAKA です。

>どうして、こんなことができるんですか?
>おせ〜て。(本当に教えてもらいたいです。)

私の場合は、マクロヘルプを一通り読んで、どんなことが出来るの
かを調べました。後は、やりたいことを、どのマクロ命令を組み合
わせたら出来るかを考えています。
ほとんどの方が、そんな感じだと思います。

人が作ったマクロを見て何をしているのかを見るのも勉強になりま
す。
ちなみに、マクロ命令にカーソルを合わせて「マクロ→マクロヘル
プ」でヘルプの該当する場所へ移動することが出来ます。


>ステルス秀丸とか、分かりません。悲しい(T_T)。
>マクロの記述を見ても、分からないのですよねぇ。

マクロヘルプの「ファイル系文」の上から2/3位の所に、
> さらに、秀丸には隠しオプションで/hというのがあります。これ
>を指定すると、秀丸エディタがステルスモードになり、画面から見
>えなくなる&マクロの実行が非常に高速になります。
> openfile "/h " + $filename
という記述があります。


がんばれば、簡単にマクロが作れるようになります。

[ ]
RE:02334 HTMLファイル内のソート?No.02336
yamasan さん 01/07/09 08:08
 
yamasanです。おはようございます。

 | 素晴らしい。グレィトです。(かなりリソースを食う感じです。)

作っていただいて、
リソース云々を言うとは、不謹慎でした。
(それだけ大変な作業であるように見受けられるということを
言いたかったのです。)

不適切な語彙・表現を用いて、申し訳ありませんでした。
すいませんでした。

[ ]
RE:02335 HTMLファイル内のソート?No.02337
yamasan さん 01/07/09 08:12
 
TAKAさん、ありがとうございました。yamasanです。

 | がんばれば、簡単にマクロが作れるようになります。

ヘルプは、折に触れてみているんですが、
なかなか分かるようになりません。
秀丸エディタQ&A集(第4版) Rev.B もよく読んで参考にさせていただいています。

でも、なかなか。今後とも、勉強しますので、どうぞ、よろしくお願いします。

[ ]
RE:02335 HTMLファイル内のソート ?No.02338
yamasan さん 01/07/09 09:30
 
TAKAさん、たびたびすいません。yamasanです。

 | > openfile "/h " + $filename
 | という記述があります。

ヘルプの、このあとに、以下のような記述がありました。

 |  ただし、これらのオプションは、現在マクロを実行している秀丸が、
 | 新規作成された秀丸であってはいけません。
 | なぜなら、新規作成された秀丸がopenfileを実行すると、
 | そのファイルをloadfileと同様に扱ってしまうからです。
 |  この場合は、changenameを使ってファイル名を"nul"にするなどして
 | 対処してください。

と言うことは、新規作成した秀丸で、今回のマクロを実行したい場合は、
マクロのどこに記述を加えるといいのでしょう。

 |     // ステルス秀丸上でデータを逆に並べる
 |     #FH = hidemaruhan( 0 );
 |     gofileend;
 |     openfile "/h";


     #FH = hidemaruhandle( 0 );
     changename "nul";
     gofileend;
     openfile "/h";

ということで、いいのでしょうか?
お願いします。
--------------
実は、このヘルプの記述を読む前に、
新規作成の秀丸にカット&ペーストで、
既存のファイルから持っていって、今回のマクロを実行しましたが、
問題なく終了できたようです。(5回ぐらい行いました。)

しかし、そういえば、windows2000では、問題なくできたようですが、
自宅のwin98機では、上手く最後まで動かなかったような感じでした。

また、お教えください。お願い申し上げます。

[ ]
RE:02338 HTMLファイル内のソート ?No.02339
TAKA さん 01/07/09 12:49
 
TAKA です。

> |  ただし、これらのオプションは、現在マクロを実行している秀丸が、
> | 新規作成された秀丸であってはいけません。
> | なぜなら、新規作成された秀丸がopenfileを実行すると、
> | そのファイルをloadfileと同様に扱ってしまうからです。
> |  この場合は、changenameを使ってファイル名を"nul"にするなどして
> | 対処してください。
>
>と言うことは、新規作成した秀丸で、今回のマクロを実行したい場合は、
>マクロのどこに記述を加えるといいのでしょう。

ここでいう新規の定義は、新規作成した無題のファイルで全く編集
                        ^^^^^^^^^^^^^^^^^^
されていない秀丸のことですので、新規作成したファイルに対して
^^^^^^^^
データを貼り付けている場合は、新規という扱いにはなりませんの
で、今回のマクロに手をいれる必要はありません。

この辺りのことが、Q&A集、
第III部〜秀丸マクロのいろはにほへと 秀丸ウィンドウの管理
http://win.blue.co.jp/~jr-kun/qa5prev/hidemaru_qa/3_window.html
にまとめられていますので、時間があれば見て下さい。

その中で、以下のような記述がありますが、
>if (filename == "" && modified == false) insert "\n";
「modified」って何のことでしょうか? > 杉浦 まさきさん
実行時にエラーが出ますし、ヘルプにも記述がないようです。


>しかし、そういえば、windows2000では、問題なくできたようですが、
>自宅のwin98機では、上手く最後まで動かなかったような感じでした。

実は、マクロ内の「setactivehidemaru」(ウィンドウの切り替え)
が正常に行かないことが、ごく稀にあります。
常駐ソフトが関係していることもあれば、何が悪いというわけでも
なく、ウィンドウの切り替えに失敗することがあります。これは、
今の所、回避する術がありません。

今回のマクロですと、上手くいかなかった場合は、マクロ実行前と
マクロ実行後で行数が違うと思いますので、それでマクロが失敗し
たか成功したかを判断するしかないと思います。

マクロの最後に、元の行数と変更後の行数をチェックして違ってい
たら警告メッセージを出すというのも一つの手だと思います。
その後で、アンドゥを2回実行して元の状態に戻しても良いと思い
ます。
失敗した後は、マクロを再度実行すれば良いと思います。

行数の取得は「linecount2」、メッセージの表示は、「message」、
アンドゥは「undo」、条件式として「if文」、数値の変数は、変数
の頭に「#」をつけます。

これらを使えば、チェックすることが可能だと思います。
トライしてみては、いかがでしょうか?

イメージとしては、以下の通りです。
・マクロ実行と同時に、ファイルの行数を変数に保存。
・マクロ実行後に、ファイルの行数と最初の行数を比較。
・行数が違っていたら、マクロが失敗している。
・エラーメッセージを出す。
・ファイルに対して、2回の編集(範囲選択している所への貼り付
 けは、秀丸が削除と貼り付けを行っている)なので、アンドゥを
 2回行って元に戻す。


今回のマクロのやり方(ワーク用の秀丸を使用)ではなく、直接編
集する方法(setactivehidemaruを使用しない)もあるのですが、
マクロが少し面倒なのと、マクロを中断したときに中途半端な状態
になりますので、今回はパスします。
#面倒なのが一番の理由ですが。


P.S.
[02336]でのお気遣いありがとうございます。

[ ]
RE:02339 HTMLファイル内のソート ?No.02340
yamasan さん 01/07/09 16:03
 
yamasanです。こんにちは。

 | されていない秀丸のことですので、新規作成したファイルに対して
 | ^^^^^^^^
 | データを貼り付けている場合は、新規という扱いにはなりませんの
 | で、今回のマクロに手をいれる必要はありません。

ありがとうございます。よく分かりました。

 | この辺りのことが、Q&A集、
 | 第III部〜秀丸マクロのいろはにほへと 秀丸ウィンドウの管理
 | http://win.blue.co.jp/~jr-kun/qa5prev/hidemaru_qa/3_window.html
 | にまとめられていますので、時間があれば見て下さい。

見ました。このQ&A集は、内容が濃いですね。
ダウンロードして、HDDに保存していますが、
まだ、見ていない部分が多いです。いろいろと見てみます。

 | 実は、マクロ内の「setactivehidemaru」(ウィンドウの切り替え)
 | が正常に行かないことが、ごく稀にあります。
 | 常駐ソフトが関係していることもあれば、何が悪いというわけでも
 | なく、ウィンドウの切り替えに失敗することがあります。これは、
 | 今の所、回避する術がありません。

そうですか。そのような事情は、知りませんでした。

いろいろと、アドバイスをありがとうございます。
お教え頂いた事をいろいろとやってみます。また、よろしくお願いします。
ありがとうございました。

[ ]
RE:02339 HTMLファイル内のソート ?No.02341
杉浦 まさき さん 01/07/10 01:13
 
ども、杉浦 まさき です。
#今日(7/10)からフレッツADSLのはず…だったのに(ToT)。

>その中で、以下のような記述がありますが、
>>if (filename == "" && modified == false) insert "\n";
>「modified」って何のことでしょうか? > 杉浦 まさきさん
>実行時にエラーが出ますし、ヘルプにも記述がないようです。

ぐふっ!…TAKA さんにはいつもいつもお世話になってますm(_ _)m。
もちろん(^^; updated の間違いです。直します。


[ ]