2013年8月15日木曜日

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

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

  1. function libname(dsn)  
  2. {  
  3.         i = index(dsn, ".");  
  4.         if (i > 0) {  
  5.                 tmp = substr(dsn, 1, i - 1);  
  6.         }  
  7.         else {  
  8.                 tmp = "WORK";  
  9.         }  
  10.         return toupper(tmp);  
  11. }  
  12.   
  13. function memname(dsn)  
  14. {  
  15.         i = index(dsn, ".");  
  16.         if (i > 0) {  
  17.                 tmp = substr(dsn, i + 1, length(dsn));  
  18.         }  
  19.         else {  
  20.                 tmp = dsn;  
  21.         }  
  22.         return toupper(tmp);  
  23. }  
  24.   
  25. function ilog(path, dsn)  
  26. {  
  27.         printf("R,%s,%s,%d,%s,%d\n", path, dsn, FNR, FILENAME, NR);  
  28.         return 1;  
  29. }  
  30.   
  31. function olog(path, dsn)  
  32. {  
  33.         printf("W,%s,%s,%d,%s,%d\n", path, dsn, FNR, FILENAME, NR);  
  34.         return 1;  
  35. }  
  36.   
  37. /NOTE: ライブラリ参照名/ && /を次のように割り当てました。/ {  
  38.         libref = $3;  
  39.         getline;  
  40.         while ($1 != "物理名") {  
  41.                 getline;  
  42.         }  
  43.         lib[libref] = $3;  
  44.   
  45. }  
  46.   
  47. $1 ~ /NOTE:/ && $2 ~ /データセット/ && $NF ~ /オブザベーションを読み込みました。/ {  
  48.         dsn = $3;  
  49.         libref = libname(dsn);  
  50.         mem = memname(dsn);  
  51.   
  52.         if (libref != "WORK" && libref != "SASHELP") {  
  53.                 dir = lib[libref];  
  54.                 if (dir != "") {  
  55.                         tmp = sprintf("%s/%s.sas7bdat", dir, tolower(mem));  
  56.                         status = ilog(tmp, dsn);  
  57.                 }  
  58.                 else {  
  59.                         printf("ERROR %s\n", dsn);  
  60.                         exit;  
  61.                 }  
  62.         }  
  63. }  
  64.   
  65. $1 ~ /NOTE:/ && $2 ~ /データセット/ && $NF ~ /変数です。/ {  
  66.         dsn = $3;  
  67.         libref = libname(dsn);  
  68.         mem = memname(dsn);  
  69.   
  70.         if (libref != "WORK" && libref != "SASHELP") {  
  71.                 dir = lib[libref];  
  72.                 if (dir != "") {  
  73.                         tmp = sprintf("%s/%s.sas7bdat", dir, tolower(mem));  
  74.                         status = olog(tmp, dsn);  
  75.                 }  
  76.                 else {  
  77.                         printf("ERROR %s\n", dsn);  
  78.                         exit;  
  79.                 }  
  80.         }  
  81. }  
  82.   
  83. $1 ~ /MPRINT\([A-Z0-9_]+\):/ && $2 ~ /^set$/ {  
  84.         match($3, /([a-zA-Z0-9_]+\.)?[a-zA-Z0-9_]+/);  
  85.         if (RLENGTH > 0) {  
  86.                 dsn = substr($3, RSTART, RLENGTH);  
  87.                 libref = libname(dsn);  
  88.                 mem = memname(dsn);  
  89.                 if (libref != "WORK" && libref != "SASHELP") {  
  90.                         dir = lib[libref];  
  91.                         if (dir != "") {  
  92.                                 tmp = sprintf("%s/%s.sas7bdat", dir, tolower(mem));  
  93.                                 status = ilog(tmp, dsn);  
  94.                         }  
  95.                         else {  
  96.                                 printf("ERROR %s\n", dsn);  
  97.                                 exit;  
  98.                         }  
  99.                 }  
  100.         }  
  101. }  
  102.   
  103. END {  
  104.         print "_EOF_";  
  105. }  

0 件のコメント :

コメントを投稿