添付ファイルの情報



[添付ファイル一覧] [全ページの添付ファイル一覧]

fileCountString.js
格納ファイル名:attach/4D6163726F2FC5EAB9C62F323139_436F756E74537472696E672E6A73
ページ:Macro/投稿/219
格納ファイル名:attach/4D6163726F2FC5EAB9C62F323139_436F756E74537472696E672E6A73
MD5ハッシュ値:acaa1c8b7dbbc54bafa1c38ae5173adf
サイズ:3.8KB (3912 bytes)
Content-type:application/octet-stream
登録日時:2013/08/31 21:13:30
アクセス数:455
MD5ハッシュ値:acaa1c8b7dbbc54bafa1c38ae5173adf
fileCountString.js
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 [概要]
	文字列の出現回数カウント
	文字列の出現回数を数え、メッセージボックスで表示します。
 [変更履歴]
	2013/02/01	新規
*/
 
// 単語単位で探すか。(半角のみ対応)
//		true=単語単位で探す / false=しない
var bSEARCH_BY_WORD    = false;
 
// 英大文字・小文字を区別するか。
//		true=区別する / false=しない
var bMATCH_CASE        = false;
 
 
 
Main();
 
function Main()
{
    var CAPTION        = Editor.ExpandParameter("$M").replace( /^.*\\/, "" );    // メッセージボックスのタイトル
    var WshShell    = new ActiveXObject("WScript.Shell");
    var oSC            = new ActiveXObject("ScriptControl");    // InputBox
    var s;
    var sSearchStr;
    var sContents;
    var sRe, sReFlag;
    var c1, c2, cc1, cc2;
    var ary;
    var nCount;
    var dt1, dt2, ms, MS, SS, MM;        // (処理時間の表示用)
    
    
    // InputBox
    oSC.Language = "VBScript";
    oSC.AddCode( 'Function InBox(prompt,title,default):InBox=InputBox(prompt,title, default):End Function' );
    s = Editor.ExpandParameter("$C");            // InputBoxの初期値
    do{
        var prompt =
            "指定した文字列の出現回数を\r\n" +
            "カウントします。\r\n" +
            "\r\n" +
            "大文字・小文字は区別" + ( bMATCH_CASE ? "されます。" : "されません。" ) + "\r\n" +
            ( bSEARCH_BY_WORD ? "単語単位で探します。\r\n" : "" );
        s = oSC.Run( "InBox", prompt, CAPTION, s );
        if( typeof s == "undefined" ) return;    // キャンセルされた
    }while( s == "" );
    sSearchStr = s;        // カウントする文字列。
    
    // 文書の全内容を取得。
    Editor.SelectAll();
    sContents = Editor.GetSelectedString(0);
    Editor.CancelMode();
    
    // カウントする文字列の正規表現。
    // 正規表現で扱う特殊文字の前に、バックスラッシュを付加する。
    sRe = sSearchStr.replace( /(\W)/g, "\\$1" );        // 簡単の為、記号類(や全角文字など)はすべて。
    sReFlag = (bMATCH_CASE) ? "g" : "ig";
    dt1 = new Date();
    if( bSEARCH_BY_WORD ){
        c1 = sSearchStr.charAt( 0 );                        // 先頭の文字。
        c2 = sSearchStr.charAt( sSearchStr.length -1 );        // 末尾の文字。
        cc1 = c1.charCodeAt( 0 );
        cc2 = c1.charCodeAt( 0 );
        if( (c1.match( /\W/ )) && (cc1 <= 0x7f) ) cc1 = -1;        // -1なら記号類とする。
        if( (c2.match( /\W/ )) && (cc2 <= 0x7f) ) cc2 = -1;
        
        // 先頭(や末尾)が記号類の場合、その文字が先頭(や末尾)に連続する箇所を消す(マッチさせない)。
        s = "";
        if( (cc1 == -1) && (cc2 == -1) ){
            // 例: #A% → "#+" + "#A%" + "%*" | "#*" + "#A%" + "%+" = /#+#A%%*|#*#A%%+/g
            //		"#A%-#A%"/"#A%#A%":一致、"##A%"/"#A%%":不一致
            // 例: #A# → "#+" + "#A#" + "#*" | "#*" + "#A#" + "#+" = /#+#A##*|#*#A##+/g
            //		"#A#-#A#":一致、"##A#"/"#A##"/"#A##A#":不一致
            // 例: # → "#+" + "#" + "#*" | "#*" + "#" + "#+" = /#+##*|#*##+/g (= /#{2,}/g)
            //		"#-#":一致、"##"/"###"/"####":不一致
            s = "\\" + c1 + "+"  + sRe +  "\\" + c2 + "*"  + "|" +
				"\\" + c1 + "*"  + sRe +  "\\" + c2 + "+";			// 処理時間が一番掛かる。
		}else if( cc1 == -1 ){
			// 例: #A → "#+" + "#A" = /#+#A/g		// "#A-#A"/"#A#A":一致、"##A":不一致
			s = "\\" + c1 + "+"  + sRe;
		}else if( cc2 == -1 ){
			// 例: A% → "A%" + "%+" = /A%%+/g		// "A%-A%"/"A%A%":一致、"A%%":不一致
			s = sRe +  "\\" + c2 + "+";
		}
		if( s.length ) sContents = sContents.replace( new RegExp( s, sReFlag ), "\uffff" );
		
		// 先頭(や末尾)が単語の構成要素文字の場合、単語の区切りを付加。
		if( c1.match( /\w/ ) ) sRe = "\\b" + sRe;
		if( c2.match( /\w/ ) ) sRe = sRe + "\\b";
	}
	
	// 検索実行。
	ary = sContents.match( new RegExp( sRe, sReFlag ) );
	nCount = (ary == null) ? 0 : ary.length;
	
	dt2 = new Date();
	s = "[" + sSearchStr + "]\r\n" +
		"の出現回数は\r\n" +
		nCount + " 回です。\r\n";
	ms = dt2.getTime() - dt1.getTime();		//[ms]
	if( ms >= 2000 ){
		// 時間がある程度掛かったら処理時間を表示しておく。
		MS = ms % 1000;
		SS = Math.floor( ms/1000 ) % 60;
		MM = Math.floor( ms/1000/60 );
		s += "\r\n(処理時間: " + (MM ? MM+"" : "") + SS + "." + ("00"+MS).slice(-3) + "秒)\r\n";
	}
	WshShell.Popup( s, 0, CAPTION );
}




    


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS