2017-06-07 22 views
-1

私は、SASプログラミングにはかなり新しいので、現在進行中のイニシアチブに最も効率的な方法を見つけようとしています。基本的には、SASサーバーに保存されている既存の.csvファイルを変更し、同じサーバー上の自分のフォルダに保存する必要があります。CSVファイル処理 - SAS

修正が必要:

  • 使用形式として.CSV保ちます "|"代わりに、区切り文字として「」の
  • は、次の出力名を持っている:filename_YYYYMMDDhhmmss.csv
  • は、元のファイルからのみ4つの変数
  • を保つ私たちはここで

を維持するいくつかの変数は、スクリプトで名前を変更私は現在使用していますが、いくつかの問題がそれであります

PROC IMPORT OUT = libname.original_file (drop=var0) 
       FILE = "/.../file_on_server.csv" 
       DBMS = CSV 
       REPLACE; 
RUN; 


%PUT date_human = %SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TODAY())-1), datetime20.)); 

proc export data = libname.original_file (rename= (var1=VAR11 var2=VAR22 Type=VAR33)) 
     outfile = '/.../filename_&date_human..csv' label dbms=csv replace; 
     delimiter='|'; 
run; 

との競合があるように見えるように名前を変更するとき、私はまた、「タイプ」と呼ばれる変数に問題がありますいくつかのシステムキーワード。日付形式も良くなく、SASフォーラムでは正確な形式を見つけることができませんでした。

このスクリプトをより効率的にするためのアドバイスは非常に高く評価されます。

答えて

1

実際にデータをSASデータセットに読み込もうとするのは面倒ではありません。ちょうどそれを処理し、それを書き戻します。入力構造が一貫していれば、それはかなり簡単です。すべてを文字列として読み込み、保持したい列を出力します。

データには12の列があり、4つのうち最後の列には10番目の列があるとします。だからあなたはそのうちの10個だけを読む必要があります。

入力したファイル名と出力するファイル名をマクロ変数で最初に設定して、編集しやすくします。論理を使用して、新しいファイルのファイル名を生成することができます。

%let infile=/.../file_on_server.csv; 
%let outfile=/.../filename_&date_human..csv; 

次に、単純なDATA_NULL_ステップを使用して、データを文字列として読み取り、それを書き戻します。必要に応じて、4つの列の相対的な順序を変更することもできます。したがって、このプログラムは2番目、5番目、4番目、10番目の列をコピーし、列ヘッダーをNewName1、NewName2、NewName3、NewName4に変更します。

data _null_; 
    infile "&infile" dsd dlm=',' truncover; 
    file "&outfile" dsd dlm='|'; 
    length var1-var10 $200 ; 
    input var1-var10; 
    if _n_=1 then do; 
    var2='NewName1'; 
    var5='NewName2'; 
    var4='NewName3'; 
    var10='NewName4'; 
    end; 
    put var2 var5 var4 var10 ; 
run; 

保存したい4つの列のデータの一部が200文字を超える場合は、LENGTH文を更新するだけです。

少し実験を試してみましょう。まず、ダミーのCSVファイルを作成しましょう。

filename example temp; 
data _null_; 
    file example ; 
    input; 
    put _infile_; 
cards4; 
a,b,c,d,e,f,g,h,i,j,k,l,m 
1,2,3,4,5,6,7,8,9,10,11,12,13 
o,p,q,r,s,t,u,v,w,x,y,z 
;;;; 

これを実行してみましょう。私はINFILEとFILE文を修正して、私の一時ファイルから読み込んで結果をログに書き出します。

infile example /* "&infile" */ dsd dlm=',' truncover; 
    file log /* "&outfile" */ dsd dlm='|'; 

ここに結果として書き込まれる行があります。

NewName1|NewName2|NewName3|NewName4 
2|5|4|10 
p|s|r|x 
+0

このような詳細な説明をいただきありがとうございます!必要な新しい変数名を得ることができる理由はありますか?その内容はすべて空ですか? –

+0

PUTがIFブロックの後ろにあることを確認してください。また、データ行が実際にカンマで区切られていることを確認してください。 IFブロックは最初のレコードの値を強制するので、最初の行も空として読み取られている可能性があります。この文を追加すると、最初の5行をダンプします。 '_n_ <= 5 then putlog _infile_;' – Tom

+0

スクリプトを修正しようとしましたが、まだ結果が得られませんでしたが、値は "|"で区切られています。指定された通りです。 –

関連する問題