同じ文字の数を数えたいNo.04058
hrogawa さん 04/01/29 20:52
 
またお知恵を拝借に来ました。
このフォーラムはレスポンスが早いのでとても参考になります。
今回は,テキストの中から同じ文字が入っている数を数えたいと思っています。

例えば,

あいうえお
あいうえお
あいうえお
あいうえお
かきくけこ
かきくけこ
かきくけこ
かきくけこ
かきくけこ
かきくけこ

ならば

あいうえお 4
かきくけこ 6

と表示させたいと考えています。
どうすればいいでしょうか。

[ ]
RE:04058 同じ文字の数を数えたいNo.04060
ENCODINGSHIFTJIS さん 04/01/30 15:16
 
テキスト処理風味なら

文字間に改行を挟んで1文字1行にする
// テキストソートする、WCを使わないなら
WC(ワードカウント)コマンドなどで集計する
個数を行頭に、文字を末尾にした行に変換する
またテキストソートする
同じ個数の行の連続を集約する

あたり、エディタの処理とはちょっとちがうかも。

連想配列、辞書、ハッシュなどの言語要素、クラスを
持つプログラム言語なら、その例題のアレンジで
済んでしまいますが。

秀丸のマクロライブラリには
文字種(半角、スペース、漢字など)ごとの集計とか
指定単語の数え上げの マクロが入っています。

[ ]
RE:04058 同じ文字の数を数えたいNo.04061
たけのこ さん 04/01/30 15:28
 
一般ユーザのたけのこです。

同じ文字=同一内容の行、ということであれば、sort uniqを使えば出来ます。
uniqコマンドはどっかから持ってこなければなりませんが。

あと、前に作ったマクロをチョチョイと直せば、それなりに使えると思います。
このマクロに食わせるテキストはソート済みであることが条件ですが。
http://www.maruo.co.jp/hidesoft/2/x16193_.html#16194

(^^)/”

[ ]
RE:04058 同じ文字の数を数えたいNo.04067
山紫水明 さん 04/02/01 14:44
 
 hrogawaさん,こんにちは。

》今回は,テキストの中から同じ文字が入っている数を数えたいと思っています。

 問題解決されましたか?
 もし,同一行の数を数えたいということであれば,次のマクロでできると思い
ます。ただし,ファイルサイズや1行文字数に制限はあると思いますが。

//----------------------------------------------------------
#handle1 = hidemaruhandle(0);
run "sort < con > con";
config "w1000"; //最新のβ版なら 2000 も可能
#handle2 = hidemaruhandle(0);
disabledraw;
gofiletop;
while( code != eof ) {
    $s = gettext( 0, y, linelen, y );
    #i = 1;
    down;
    while( 1 ) {
        if( gettext( 0, y, linelen, y ) == $s ) #i = #i + 1;
        else break;
        down;
    }
    $ss = $ss + $s + "\t" + str(#i) + "\n";
}
setactivehidemaru #handle1;
closehidemaru #handle2;
message $ss;
    //あるいは以下2行
//gofileend;
//insert "\n" + $ss;
endmacro;
//----------------------------------------------------------

     では, (^^)/~
                                        山紫水明

[ ]
RE:04067 みなさんありがとうございますNo.04074
hrogawa さん 04/02/02 19:26
 
仕事でばたばたしていて,返事が遅くなりました。
すいません。

みなさんアドバイスありがとうございます。
アドバイスを元に考えてみます。
またわからなくなったら質問するかもしれません。

[ ]
RE:04067 同じ文字の数を数えたい→山紫さNo.04075
hrogawa さん 04/02/02 20:06
 
hrogawaです。
以下のマクロありがとうございました。
できそうな気がしてきました。
申し訳ないですが,もう1つ教えてください。
今,1300行近くあるデータでやったのですが,「文字列が長すぎます」というメッ
セージが出ました。
200行ならOKでした。
これは,メモリー容量の問題なのでしょうか。
(とんちんかんな質問だったらすいません)
解決は無理なのですかね。


>//----------------------------------------------------------
>#handle1 = hidemaruhandle(0);
>run "sort < con > con";
>config "w1000"; //最新のβ版なら 2000 も可能
>#handle2 = hidemaruhandle(0);
>disabledraw;
>gofiletop;
>while( code != eof ) {
>    $s = gettext( 0, y, linelen, y );
>    #i = 1;
>    down;
>    while( 1 ) {
>        if( gettext( 0, y, linelen, y ) == $s ) #i = #i + 1;
>        else break;
>        down;
>    }
>    $ss = $ss + $s + "\t" + str(#i) + "\n";
>}
>setactivehidemaru #handle1;
>closehidemaru #handle2;
>message $ss;
>    //あるいは以下2行
>//gofileend;
>//insert "\n" + $ss;
>endmacro;
>//----------------------------------------------------------
>
>     では, (^^)/~
>                                        山紫水明

[ ]
RE:04075 同じ文字の数を数えたい→山紫さNo.04076
山紫水明 さん 04/02/02 22:37
 
 hrogawaさん,こんばんは。

》今,1300行近くあるデータでやったのですが,「文字列が長すぎます」という
》メッセージが出ました。
》200行ならOKでした。

 文字列の長さに制限があるためでした。
 次のマクロでお試しください。

//-------- CountSameLine.mac --------------------------------------------
run "sort < con > con";
#handle1 = hidemaruhandle(0);
openfile "/h CountSameLine.txt";
#handle2 = hidemaruhandle(0);
setactivehidemaru #handle1;
config "w1000"; //最新のβ版なら 2000 も可能
disabledraw;
gofiletop;
#n = 1;
while( code != eof ) {
    $s = gettext( 0, y, linelen, y );
    #i = 1;
    down;
    while( 1 ) {
        if( gettext( 0, y, linelen, y ) == $s ) #i = #i + 1;
        else break;
        down;
    }
    $ss[#n] = $s + "\t" + str(#i);
    #n = #n + 1;
    if( #n > 1000 ) {
        setactivehidemaru #handle2;
        call Write;
        setactivehidemaru #handle1;
        #n = 1;
    }
}
setactivehidemaru #handle2;
closehidemaru #handle1;
call Write;
endmacro;

Write:
##i = 1;
while( ##i < #n ) {
    insert $ss[##i] + "\n";
    ##i = ##i + 1;
}
return;
//----------------------------------------------------------

     では, (^^)/~
                                        山紫水明

[ ]
RE:04076 同じ文字の数を数えたい→山紫さNo.04079
hrogawa さん 04/02/03 20:33
 
ありがとうございました!
うまくいきました。

ところで,初心者なのでちょっと教えてください。

run "sort < con > con";
#handle1 = hidemaruhandle(0);
openfile "/h CountSameLine.txt";
#handle2 = hidemaruhandle(0);
setactivehidemaru #handle1;

ここはどういう処理をしているのでしょう。
ヘルプを見てもわかりませんでした。
お手すきのときにお答えいただけると幸いです。




> hrogawaさん,こんばんは。
>
>》今,1300行近くあるデータでやったのですが,「文字列が長すぎます」という
>》メッセージが出ました。
>》200行ならOKでした。
>
> 文字列の長さに制限があるためでした。
> 次のマクロでお試しください。
>
>//-------- CountSameLine.mac --------------------------------------------
>run "sort < con > con";
>#handle1 = hidemaruhandle(0);
>openfile "/h CountSameLine.txt";
>#handle2 = hidemaruhandle(0);
>setactivehidemaru #handle1;
>config "w1000"; //最新のβ版なら 2000 も可能
>disabledraw;
>gofiletop;
>#n = 1;
>while( code != eof ) {
>    $s = gettext( 0, y, linelen, y );
>    #i = 1;
>    down;
>    while( 1 ) {
>        if( gettext( 0, y, linelen, y ) == $s ) #i = #i + 1;
>        else break;
>        down;
>    }
>    $ss[#n] = $s + "\t" + str(#i);
>    #n = #n + 1;
>    if( #n > 1000 ) {
>        setactivehidemaru #handle2;
>        call Write;
>        setactivehidemaru #handle1;
>        #n = 1;
>    }
>}
>setactivehidemaru #handle2;
>closehidemaru #handle1;
>call Write;
>endmacro;
>
>Write:
>##i = 1;
>while( ##i < #n ) {
>    insert $ss[##i] + "\n";
>    ##i = ##i + 1;
>}
>return;
>//----------------------------------------------------------
>
>     では, (^^)/~
>                                        山紫水明

[ ]
RE:04079 同じ文字の数を数えたい→山紫さNo.04080
山紫水明 さん 04/02/03 22:31
 
 hrogawaさん,こんばんは。

》ところで,初心者なのでちょっと教えてください。

 あえて苦言を呈しますが,引用は必要最小限にして,全文引用は避けましょう。
 通常のメールの場合も同じですが,相手の署名まで引用するのは,ネチケット
では失礼なこととされています。

》run "sort < con > con";
》#handle1 = hidemaruhandle(0);
》openfile "/h CountSameLine.txt";
》#handle2 = hidemaruhandle(0);
》setactivehidemaru #handle1;

》ここはどういう処理をしているのでしょう。

 sort はコマンドプロンプトといわれているもので,行を整列するものです。
コマンドプロンプトについては,web 上で検索すればわかると思います。
 hidemaruhandle, opnfile "/h", setactivehidemaru などは,秀丸のヘルプを
調べればわかるでしょう。

     では, (^^)/~
                                        山紫水明

[ ]
RE:04080 ありがとうございましたNo.04085
hrogawa さん 04/02/04 19:54
 
返事をどうもありがとうございました。
いただいた内容を基に自分で調べてみます。

> あえて苦言を呈しますが,引用は必要最小限にして,全文引用は避けましょう。
> 通常のメールの場合も同じですが,相手の署名まで引用するのは,ネチケット
>では失礼なこととされています。

失礼しました。
以後気をつけます。

[ ]