4

簡単な質問。

PROC IMPORT OUT= braw.address
DATAFILE= "&path.\address_data.csv"
DBMS=csv REPLACE;
GETNAMES=YES;

RUN;

このステートメントは、値に応じてデータセット列を文字または数値として作成します。これは賢明ですが、私が望むものではありません。

正規表現の評価を容易にするために、それらをすべて文字としてインポートしたいと思います。

これを行う簡単な方法はありますか?

4

3 に答える 3

3

私は通常、CSV用に独自の入力ステートメントを作成するだけで、好きなように作成できます。

IE:

data braw.address;
infile "&path.\address_data.csv" dlm=',' dsd missover;
input
 field1 $
 field2 $
....
;
run;

PROC IMPORTからのログを使用して、これを初めて生成し、各変数の$を含むように編集することができます。

于 2013-01-30T22:29:51.817 に答える
1

すべての列を文字として読み取る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');
于 2013-01-31T00:00:34.837 に答える
0

これが、すべての変数を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;
于 2015-01-27T05:11:49.660 に答える