簡単な質問。
PROC IMPORT OUT= braw.address
DATAFILE= "&path.\address_data.csv"
DBMS=csv REPLACE;
GETNAMES=YES;
RUN;
このステートメントは、値に応じてデータセット列を文字または数値として作成します。これは賢明ですが、私が望むものではありません。
正規表現の評価を容易にするために、それらをすべて文字としてインポートしたいと思います。
これを行う簡単な方法はありますか?
簡単な質問。
PROC IMPORT OUT= braw.address
DATAFILE= "&path.\address_data.csv"
DBMS=csv REPLACE;
GETNAMES=YES;
RUN;
このステートメントは、値に応じてデータセット列を文字または数値として作成します。これは賢明ですが、私が望むものではありません。
正規表現の評価を容易にするために、それらをすべて文字としてインポートしたいと思います。
これを行う簡単な方法はありますか?
私は通常、CSV用に独自の入力ステートメントを作成するだけで、好きなように作成できます。
IE:
data braw.address;
infile "&path.\address_data.csv" dlm=',' dsd missover;
input
field1 $
field2 $
....
;
run;
PROC IMPORTからのログを使用して、これを初めて生成し、各変数の$を含むように編集することができます。
すべての列を文字として読み取るSASマクロを作成したくない場合は、「チート」を試すことができます。ファイルを手動で編集し、最初の行(列ヘッダーを含む行。これらはすべて文字列である可能性が高いため、SASはすべての列を文字としてインポートする必要があります)を複製します。
もちろん、これを行うためのマクロはそれほど難しくありません。あなたはこのようなことを試すことができます:
%macro readme(dsn,fn);
/* Macro to read all columns of a CSV as character */
/* Parameters: */
/* DSN - The name of the SAS data set to create */
/* FN - The external file to read (quoted) */
/* Example: */
/* %readme(want, 'c:\temp\tempfile.csv'); */
data _null_;
infile &fn;
input;
i = 1;
length headers inputstr $200;
headers = compress(_infile_,"'");
newvar = scan(headers,1,',');
do until (newvar = ' ');
inputstr = trim(inputstr) || ' ' || trim(newvar) || ' $';
i + 1;
newvar = scan(headers,i,',');
end;
call symput('inputstr',inputstr);
stop;
run;
data &dsn;
infile &fn firstobs=2 dsd dlm=',' truncover;
input &inputstr.;
run;
%mend;
%readme(want, 'c:\temp\tempfile.csv');
これが、すべての変数をcharとして含むdlmファイルを読み取るための私のマクロです。
%MACRO ImportText(file,dsn,dlm);
* Read data use proc import to get variable name and length;
PROC IMPORT DATAFILE="&file" OUT=temp DBMS=dlm REPLACE;
DELIMITER = &dlm;
GETNAMES = YES;
GUESSINGROWS = 32767;
RUN;
* Put variable names into macro variable;
PROC CONTENTS DATA=temp out=vars NOPRINT; RUN;
PROC SQL NOPRINT;
SELECT CATT(name,' : $',length,'.') INTO :vars SEPARATED BY ' ' FROM vars ORDER BY varnum;
QUIT;
* Read real data;
DATA &dsn;
INFILE "&file" DELIMITER=&dlm MISSOVER DSD FIRSTOBS=2 LRECL=32767;
INPUT &vars;
RUN;
%MEND;