2013年8月15日木曜日

データセットのI/Oを補足するコード(私家版#2)

これ自分用のコードです。

function libname(dsn)
{
        i = index(dsn, ".");
        if (i > 0) {
                tmp = substr(dsn, 1, i - 1);
        }
        else {
                tmp = "WORK";
        }
        return toupper(tmp);
}

function memname(dsn)
{
        i = index(dsn, ".");
        if (i > 0) {
                tmp = substr(dsn, i + 1, length(dsn));
        }
        else {
                tmp = dsn;
        }
        return toupper(tmp);
}

function ilog(path, dsn)
{
        printf("R,%s,%s,%d,%s,%d\n", path, dsn, FNR, FILENAME, NR);
        return 1;
}

function olog(path, dsn)
{
        printf("W,%s,%s,%d,%s,%d\n", path, dsn, FNR, FILENAME, NR);
        return 1;
}

/NOTE: ライブラリ参照名/ && /を次のように割り当てました。/ {
        libref = $3;
        getline;
        while ($1 != "物理名") {
                getline;
        }
        lib[libref] = $3;

}

$1 ~ /NOTE:/ && $2 ~ /データセット/ && $NF ~ /オブザベーションを読み込みました。/ {
        dsn = $3;
        libref = libname(dsn);
        mem = memname(dsn);

        if (libref != "WORK" && libref != "SASHELP") {
                dir = lib[libref];
                if (dir != "") {
                        tmp = sprintf("%s/%s.sas7bdat", dir, tolower(mem));
                        status = ilog(tmp, dsn);
                }
                else {
                        printf("ERROR %s\n", dsn);
                        exit;
                }
        }
}

$1 ~ /NOTE:/ && $2 ~ /データセット/ && $NF ~ /変数です。/ {
        dsn = $3;
        libref = libname(dsn);
        mem = memname(dsn);

        if (libref != "WORK" && libref != "SASHELP") {
                dir = lib[libref];
                if (dir != "") {
                        tmp = sprintf("%s/%s.sas7bdat", dir, tolower(mem));
                        status = olog(tmp, dsn);
                }
                else {
                        printf("ERROR %s\n", dsn);
                        exit;
                }
        }
}

$1 ~ /MPRINT\([A-Z0-9_]+\):/ && $2 ~ /^set$/ {
        match($3, /([a-zA-Z0-9_]+\.)?[a-zA-Z0-9_]+/);
        if (RLENGTH > 0) {
                dsn = substr($3, RSTART, RLENGTH);
                libref = libname(dsn);
                mem = memname(dsn);
                if (libref != "WORK" && libref != "SASHELP") {
                        dir = lib[libref];
                        if (dir != "") {
                                tmp = sprintf("%s/%s.sas7bdat", dir, tolower(mem));
                                status = ilog(tmp, dsn);
                        }
                        else {
                                printf("ERROR %s\n", dsn);
                                exit;
                        }
                }
        }
}

END {
        print "_EOF_";
}

0 件のコメント :

コメントを投稿