2013年8月15日木曜日

SASデータセットのI/Oを捕捉するコード(私家版)

SASログからI/Oを追いかける私家版のSASプログラム。入力のCSVファイルはAWKで作成しています。お客様先で大量のSASログから、入力と出力を特定するためのものです。入力ファイルで1件もデータを読まないで、僅かにMPRINTのログにしか手掛かりがないものが厄介です。
その他に、SASHELP.VTABLEを通してファイルの存在チェックをしているものなど、SASログには現れない入力があります。

  1. /*  
  2. *++  
  3. * import io log-file  
  4. *--  
  5. */  
  6.   
  7. data iods;  
  8.  infile "c:\temp\iods.csv" dsd firstobs=2;  
  9.  attrib RW length=$1;  
  10.  attrib FILENAME length=$64;  
  11.  attrib DSN length=$32;  
  12.  attrib FNR length=8;  
  13.  attrib LOG length=$61;  
  14.  attrib NR length=8;  
  15.  input rw filename dsn fnr log nr;  
  16. run;  
  17.   
  18. /*  
  19. *++  
  20. * input data-set  
  21. *--  
  22. */  
  23.   
  24. proc sort data=iods out=ids;  
  25.  by filename nr rw;  
  26. run;  
  27.   
  28. data ids;  
  29.  set ids;  
  30.  by filename nr rw;  
  31.  if first.filename and rw eq 'R' then output;  
  32. run;  
  33.   
  34. proc sort data=ids;  
  35.  by nr;  
  36. run;  
  37.   
  38.   
  39. /*  
  40. *++  
  41. * output data-set  
  42. *--  
  43. */  
  44.   
  45. proc sort data=iods out=ods;  
  46.  where rw eq 'W';  
  47.  by filename nr;  
  48. run;  
  49.   
  50. data ods;  
  51.  set ods;  
  52.  by filename nr;  
  53.  if last.filename then output;  
  54. run;  
  55.   
  56. proc sort data=ods;  
  57.  by nr;  
  58. run;  
  59.   
  60. /*  
  61. *++  
  62. * make compare procedure statement  
  63. *--  
  64. */  
  65.   
  66. data _null_;  
  67.  set ods;  
  68.  attrib comment length=$256;  
  69.  attrib libstat length=$256;  
  70.  attrib titstat length=$256;  
  71.  attrib comproc length=$256;  
  72.  attrib mem length=$32;  
  73.   
  74.  basedir = "/sumdata/bk02";  
  75.   
  76.  comment = "/* dsn=" || compress(upcase(dsn)) || " logfile=" || compress(log) || " line=" || compress(put(fnr, best.)) || " */";  
  77.  put comment;  
  78.   
  79.  i = 1;  
  80.  imax = length(filename);  
  81.  pos = 0;  
  82.   
  83.  do i=1 to imax;  
  84.   if substr(filename, i, 1) eq '/' then pos = i;  
  85.  end;  
  86.   
  87.  put "options nocenter;";  
  88.  libstat = "libname tmp1 '" || compress(basedir) || substr(filename, 1, pos-1) || "' access=readonly;";  
  89.  put libstat;  
  90.   
  91.  libstat = "libname tmp2 '" || substr(filename, 1, pos-1) || "' access=readonly;";  
  92.  put libstat;  
  93.   
  94.  titstat = "title 'dsn=" || compress(upcase(dsn)) || " log=" || compress(log) || "';";  
  95.  put titstat;   
  96.   
  97.  mem = substr(dsn, index(dsn, ".")+1);  
  98.  comproc = "proc compare base=tmp1." || compress(mem) || " compare=tmp2." || compress(mem) || " maxprint=5;";  
  99.  put comproc;  
  100.  put "run;";  
  101.  put "title;";  
  102.  put ;  
  103.   
  104. run;  

0 件のコメント :

コメントを投稿