2016-08-17 280 views
3

質問: PROC IMPORTを使用するときに、.xlsxファイルからインポートする変数タイプを定義するにはどうすればよいですか?SAS:PROCでインポートするときにタイプを定義するIMPORT


私の仕事

私は、SAS v9.4を使用しています。私が知っている限り、バニラSASです。私は、SAS/ACCESSを持っていないなど

私のデータは次のようになります。

ID1  ID2 MONTH YEAR QTR VAR1 VAR2 
ABC_1234 1 1  2010 1 869  3988 
ABC_1235 12 2  2010 1 639  3144 
ABC_1236 13 3  2010 2 698  3714 
ABC_1237 45 4  2010 2 630  3213 

私が実行している手順は次のとおりです。私はこのステップを実行すると

proc import out=rawdata 
    datafile = "c:\rawdata.xlsx" 
     dbms = xlsx replace; 

    format ID1 $9. ; 
    format ID2 $3. ; 
    format MONTH best2. ; 
    format YEAR best4. ; 
    format QTR best1. ; 
    format VAR1 best3. ; 
    format VAR2 best4. ; 
run; 

、私が取得するには、次ログ出力:

ERROR: You are trying to use the character format $ with the numeric variable ID2 in data set WORK.RAWDATA.

これは、SASが自動的に変数タイプを割り当てるということです。私はそれを手動で制御できるようにしたい。私はこれを行う方法を説明するドキュメントを見つけることができません。 INFORMAT、LENGTH、およびINPUTステートメントはPROC IMPORTでは機能していないようです。

私はPROC IMPORTを使用しています。これは全体的に.xlsxファイルで最大の成功を収めているためです。私が考えることができる2つの解決策は、1).xlsxを.csvに変換し、DATAステップでINFILEを使用し、2)データを数値として取り込み、後のステップで文字に変換することです。私は、データの手動操作(エラーの可能性がある先行ゼロなど)を手動で操作する必要があるため、最初のソリューションは嫌いです。私は誤ってエラーを導入する可能性があります(やはり先頭に0をつけるなど)、無関係の作業を導入するため、2番目の方法は嫌いです。

+2

「SAS/ACCESS to PCファイル」のライセンスはありませんか?私は「DBMS = XLSX」もそれを必要としていたという印象を受けました。 – Joe

+0

また、 'proc import'で直接' format'文を使うことはできませんでした。 – Joe

+0

@Joe 'dbms = xlxs'はBASEの一部になったと思います。 'EXCEL'と他の人はまだPCファイルが必要です。違いは分かりません。 – DomPazz

答えて

4

Excelで列の種類を「テキスト」に設定して、SASがそれを決定するかどうかを確認できます。試してみる価値。

PC Files Serverを使用していないか、同じビットサーバーのExcelを同じSASサーバーにインストールしてファイルに直接アクセスする場合を除き、別のデータステップを使用して列。あなたがExcelにSAS /アクセスを持っているならば

proc import 
    file = "c:\rawdata.xlsx" 
    out=_rawdata(rename=(ID2 = _ID2)) 
    dbms = xlsx replace; 
run; 

data rawdata; 
    format ID1 $9. ; 
    format ID2 $3. ; 
    format MONTH best2. ; 
    format YEAR best4. ; 
    format QTR best1. ; 
    format VAR1 best3. ; 
    format VAR2 best4. ; 

    set _rawdata; 

    ID2 = cats(_ID2); 

    drop _:; 
run; 

、あなたはDBDSOPTS data set optionと直接これらの変数を制御することができます。例えば:proc importxlsxエンジンがSASの内部にあり、かつExcelエンジンから分離しているので

libname myxlsx Excel 'C:\rawdata.xlsx'; 

data rawdata; 
    set myxlsx.'Sheet1$'n(DBDSOPTS="DBTYPE=(ID2='CHAR(3)')"); 
run; 

問題が発生している理由です。 ExcelエンジンはMicrosoft JetまたはAceを使用しますが、xlsxエンジンはMicrosoftのような制御機能を持たない専用システムを使用します。なぜこれが当てはまるのか、私は分かりません。

proc importを実行すると、SASは(あなたがXLSファイルがguessingrowsオプションを使用してコントロールの上に持っていないもの)、それがどうあるべきかの形式を推測しようとします。すべての数値を検出すると、数値変数を仮定します。残念ながら、SAS/ACCESS to ExcelまたはPC Files Serverがインストールされていないと、変数タイプを直接制御することはできません。

+1

xlsxエンジンはおそらくOpen OfficeのXMLドキュメントフォーマットを使用していますが、Jetエンジンはおそらくそれに加え独自のMSフォーマットを処理します。なぜそれがそれをサポートしていないのか、それともそれを修正して目的の機能を追加するのかを見つけ出すことはできません。 –

+0

^8k行のprocテンプレートコードをふるいにかけたいと思ったら... –

+0

これは興味深い考えです。それ! –

0

Excelでタイプを定義します。

変換する場合は、データステップを使用して列を変換します。

data want ; 
    length id1 $9 id2 $3 ; 
    set rawdata(rename=(id2=numeric_id2)); 
    id2=cats(numeric_id2); 
    drop numeric_id2; 
run; 
関連する問題