JScriptで文字列置換&ファイルの重複行削除

超ニッチなスクリプトを2つ作成。


文字列置換

これは勘違い。JScriptの文字列置換に関する勘違い - やりたくないことはやらずに済む努力をすべきを参照。

JScriptのreplaceメソッドは、最初に見つかった文字列しか置換されないようなので完全に置換できる関数を自作。バックスラッシュを検索文字に含めると怒られるのでエスケープで誤魔化してみる。(WSHがVer 5.6なのがマズイのか?)

/**
 * 文字列を完全に置換する(検索文字列がなくなるまで置換を繰り返す)
 * @param srcText 置換処理の対象となる文字列
 * @param regExp 検索する文字列
 * @param replaceText 置換する文字列
 * @return 置換処理後の文字列
 */
function replaceCompletely(srcText, regExp, replaceText)
{
    // 検索する文字列を一旦エスケープ
    var regExpStr = escape(regExp);

    // "\"を置換する。正規表現に対応するため、"\\"とする。
    while (regExpStr.search("%5C") >= 0) {
        regExpStr = regExpStr.replace("%5C", "\\\\");
    }

    // エスケープした文字列を元に戻す
    regExpStr = unescape(regExpStr);

    // 検索文字列がなくなるまで置換を繰り返す
    while (srcText.search(regExpStr) >= 0) {
        srcText = srcText.replace(regExp, replaceText);
    }

    return srcText;
}


ファイルの重複行削除

テキストファイルの重複行を削除して別ファイルに書き出す。それだけ。効率? なにそれおいしいの?

/**
 * 重複行を削除する
 * @param strInput 入力ファイル名
 * @param strOutput 出力ファイル名
 */
function undupLine(strInput, strOutput)
{
    var objInput;
    var objOutput;
    var line;
    var lines = new Array();
    var i;
    var isDup;

    // 入力ストリームを開く
    objInput = objFso.OpenTextFile(strInput, 1, false);

    // 出力ストリームを開く
    objOutput = objFso.CreateTextFile(strOutput , true);

    try{
        while (objInput.AtEndOfStream == false) {
            // 入力ストリームから1行ずつ読み込む
            line = objInput.ReadLine();

            // 読み込んだ1行が一度でも出力された文字列であればisDupをtrueにする
            isDup = false;
            for(var i in lines) {
                if(line == lines[i]) {
                    isDup = true;
                    break;
                }
            }

            // 一度も出力されていない文字列のみ出力する
            // 出力した文字列は出力文字列リスト(lines)に追加する
            if(isDup == false) {
                objOutput.WriteLine(line);
                lines.push(line);
            }
        }
    }
    finally{
        // 入力ストリームを閉じる
        objInput.close();

        // 出力ストリームを閉じる
        objOutput.close();
    }
}