BookmarkSubscribeRSS Feed
s-mac
Fluorite | Level 6

こんにちは。

proc importで列の型式を文字に統一したため、mixed=YESを指定しているのですが、エラーが起きてしまいます。

使っているソフトはEnterprise Guide 7.15なのですがこちらだと使えないのでしょうか?

 

エラー内容としては以下です。

ERROR 180-322: ステートメントが有効でないか、適切な順序で使用されていません。

 

ソースコード

%let workdir = %sysfunc(getoption(work));

/* --------------------------------- */
data _null_;
length fname $300 ;
/* ワイルドカードで指定したファイルのうち、先頭の1つを取得する。 */
/* infile "&workdir/(探したいファイル名)" filename=fname; */
infile "&workdir/JTY.xlsx" filename=fname;
input @;
call symputx('fname',fname);
stop;
run;

proc import
file="&fname"
/* 出力先のデータセット名を指定。複数取り込む場合以外はそのままでもOK */
out=work.IMPORT_FILE
/* Excelの場合。CSVも取り込み可能だが構文が少し違うので注意(省略) */
dbms=xlsx
replace;
/* 取り込む範囲を指定 */
range="A1:S2000";
/* 取り込むシート名を指定 */
sheet="sheet1";
GETNAMES=YES;
mixed=yes
run;

 

4 REPLIES 4
moriokayutaka
Fluorite | Level 6

おそらく出ているエラー自体は

mixed=yes
run;
の部分でyesの後に[;]が抜けているからだと思います
ただmixedオプションは,dbms=xlsxかつ64bit環境下でエラーになるという事象もあったかと思うので,一度お確かめくださいです

s-mac
Fluorite | Level 6
返信ありがとうございます。
[;]抜けに関しては文面に張り付けた際に誤って削除していたみたいです。失礼しました。

ご指摘頂いた通り、dbms=xlsxかつ64bit環境下でエラー説が濃厚ですね。
残念です。。。

もし、他の方法で複数列の型式を強制的に文字に統一する手段がありましたら、ご教授頂けると幸いです。
moriokayutaka
Fluorite | Level 6

申し訳ないです.情けない限りですが,現状の私の知識だと,文字型を強制してのEXCEL読み込みはDDEぐらいしか思い浮かばず, EGから通るのかちょっとわからかなったです.
古い時代の日本のサポートページだと,CSVにしてから読み込めば回避可能ですとかって,突っ込みどころの多い解説があったり..
https://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/access014.html

SAS Baseの方のメンテナンスリリースのM7とかであればFCMPでPyhonコード使えるので,もしかしたらそっこからExcel操作をかましてどうにかなるのかもですが,ちょっと未検証なのと,やはりEGの方でどうなのかわからず…
すみません,他の方の回答待ちです…

sas7016
SAS Employee

dbms=EXCEL とすれば、mixedオプションが有効になると思います。

https://go.documentation.sas.com/doc/ja/pgmsascdc/9.4_3.5/acpcref/n0msy4hy1so0ren1acm90iijxn8j.htm

 

参考までに、mixedオプションは、型判定に使われるオブザベーション(最初の何行か)のなかに数値と文字列が混在していた場合に文字列変数になるもので、その最初の何行かに文字が含まれていなければ数値変数になります。私の環境では最初の8オブザベーションで判定するようで、8行目まで数値で9行目に文字列がある場合は数値変数と判定され、9行目は欠損となります。

 

ちなみに、別のコミュニティでは、getnames=No にして変数名の行から読めばすべて文字列変数になる、というあまりスマートではない解決法も提案されています。

https://communities.sas.com/t5/SAS-Procedures/PROC-IMPORT-EXPORT-forcing-column-to-be-character-or-n...

(上記リンク先では dbdsopts オプションで変数ごとの型指定をする方法も提案されていますが、私の環境では再現できず...。よければ試してみてください。)