2016年2月15日月曜日

ZIP圧縮のファイルを書く

投稿を修正して再度掲載します。

HULFT転送されてきたテキストファイルを読み込んでデータセット化するときに、元のファイルは残しておきたいことがあります。そのときに、圧縮して保存しとくと容量削減できて良いです。下のサンプルは、お馴染みCLASSのデータを使ったものです。名前と年齢をZIPファイルに出力し、後半のDATAステップでZIPファイルから読み取っています。


  1. 23   filename foo ZIP 'C:\temp\testzip.zip';  
  2. 24  
  3. 25   /* write to zip file */  
  4. 26   data _null_;  
  5. 27       file foo(class);  
  6. 28       set sashelp.class;  
  7. 29       put name age;  
  8. 30   run;  
  9.    
  10. NOTE: ファイルライブラリFOO :  
  11.       Directory=C:\temp\testzip.zip  
  12.    
  13. NOTE: 出力ファイルFOO(class) :  
  14.       Filename=C:\temp\testzip.zip,  
  15.       Member Name=class  
  16.    
  17. NOTE: 19レコードをファイルライブラリFOOに書き込みました。  
  18.       最小レコード長は9です。  
  19.       最大レコード長は15です。  
  20. NOTE: 19レコードを出力ファイルFOO(class)に書き込みました。  
  21.       最小レコード長は9です。  
  22.       最大レコード長は15です。  
  23. NOTE: データセットSASHELP.CLASSから19オブザベーションを読み込みました。  
  24. NOTE: DATAステートメント処理(合計処理時間):  
  25.       処理時間           0.01 秒  
  26.       CPU時間            0.01 秒  
  27.    
  28.    
  29. 31  
  30. 32   /* read from zip file */  
  31. 33   data work.class;  
  32. 34       infile foo(class);  
  33. 35       input name $ age;  
  34. 36   run;  
  35.    
  36. NOTE: 入力ファイルライブラリFOO:  
  37.       Directory=C:\temp\testzip.zip  
  38.    
  39. NOTE: 入力ファイルFOO(class) :  
  40.       Filename=C:\temp\testzip.zip,  
  41.       Member Name=class  
  42.    
  43. NOTE: 19レコードを入力ファイルライブラリFOOから読み込みました。  
  44.       最小レコード長は9です。  
  45.       最大レコード長は15です。  
  46. NOTE: 19レコードを入力ファイルFOO(class)から読み込みました。  
  47.       最小レコード長は9です。  
  48.       最大レコード長は15です。  
  49. NOTE: データセットWORK.CLASSは19オブザベーション、2変数です。  
  50. NOTE: DATAステートメント処理(合計処理時間):  
  51.       処理時間           0.01 秒  
  52.       CPU時間            0.01 秒  
便利!

2 件のコメント :

  1. ログを貼ってから気がついた。
    このログは、SAS Log Utilityで、ZIPファイルの読み書きを捕捉できない!

    返信削除
  2. CSVでエクスポートしながらZIPファイルに書き込むことも可能です。member=でファイル名を指定します。

    filename foo zip 'C:\temp\foo.zip' member='iris.txt';

    proc export data=sashelp.iris outfile=foo
    dbms=dlm replace;
    delimiter='|';
    run;

    返信削除