0

以下のコードを使用して、複数の Excel ファイルをインポートしようとしています。各 Excel ファイルには、数値とテキスト値の両方を含む列がありますが、proc インポートは数値のみをインポートし、テキスト値を空白 ('.') として配置します。

誰でもこの問題を手伝ってもらえますか? どうもありがとう。

%let subdir=S:\Temp\;  

filename dir "&subdir.*.xls";

data new;

length filename  fname $ 32767;

infile dir  eof=last filename=fname;

input ;

last: filename=fname; 

run; 

proc sort data=new nodupkey;

by filename;

run;

data null;

set new end=last;

call symputx(cats('filename',_n_),filename);

call symputx(cats('dsn',_n_),scan(scan(filename,7,'\'),1,'.'));

if last then call symputx('nobs',_n_);

run;

%put &nobs;

%macro import;

%do i=1 %to &nobs;


proc import datafile="&&filename&i" out=&&dsn&i 

dbms=excel replace;

sheet = "Sheet1";

getnames=yes;

mixed=yes;

run;


%end;

%mend import;

%import
4

2 に答える 2

1

インポートされた Excel ワークブックのデータ型を制御する最良の方法はDBSASTYPE、libname で data set オプションを使用することです。これは、他のデータ型 (日時や時刻の値など) を扱う場合に特に便利です。

たとえば、影響を受ける列の名前がMY_VARで、常に最大長 30 の文字として読み取られる必要があるとします。また、Excel でコード化された日付とタイム スタンプを含むSTART_TIMEという名前のスプレッドシート列があるとします。マクロは次のように修正される場合があります。

libname x "&&filename&i";
data &&dsn&i;
   set x.'Sheet1$'n(dbsastype=(MY_VAR=char30 START_TIME=datetime));
run;
libname x clear;

問題の原因となっている Excel 列の名前がわかっている限り、これはうまくいくはずです。

于 2013-04-08T23:23:08.613 に答える
0

Mixed=Yes で問題が解決するはずですが、そうでない場合はいくつかの解決策があります。

まず、スキャン値を確認することをお勧めします。ここで可能な場所の 1 つを確認できます: http://support.sas.com/kb/35/563.html

HKEY_LOCAL_MACHINE ► ソフトウェア ► Microsoft ► Office ► 12.0 ► アクセス接続エンジン ► エンジン

Office の古いバージョン (2007 年より前) を使用している場合、それは "JET エンジン" と呼ばれ、わずかに異なる場所にあります (Google で検索できます)。「12.0」は、インストールしたものによって異なる場合があります (12.0 は Office 2007 です)。

次に、列を強制的に特定の型にすることができます。DBSASTYPE オプションは、これを行うために必要な場所です。たとえば、http: //www2.sas.com/proceedings/sugi31/020-31.pdfを参照してください (ドキュメントのほぼ中央で、DBSASTYPE を検索してください)。

于 2013-04-08T21:27:33.470 に答える