2017-07-18 6 views
0

64ビットSAS 9.4を使用して32ビットExcelからファイルをインポートしています。私のExcelの列の多くは、このように、日付の両方の日付とリストが含まれています。SAS 9.4 64ビットXLSX 32ビットインポート:日付とテキストがテキストとして読み込まれ、日付が未フォーマットの列

SeptemberDatesCol
9/13 & 9/27
9/13 & 9/26
9月1日& 9/10 & 9/21
9/23
9/30
9/30
9/28

私は、ファイルの所有者でないんだけど、それはRが更新されますegularlyなので、すべての主要な操作とフォーマットはSASで行う必要があります。インポート後、1行に1つの日付の通常のリストに変更できますが、インポート自体は日付を正しくインポートしていません。私のインポートコード:

PROC IMPORT OUT=Raw_Import DATAFILE= "J:\filename.xlsx" DBMS=XLSX REPLACE; 
SHEET="Sheetname"; 
GETNAMES=YES;  
RUN; 

文字変数としてSeptemberDatesCol輸入(必要に応じて)、単一の日付を持つ行の一部ためのことを除いて、日付がExcelの生の未フォーマットの日付大会値でインポートされます:

SeptemberDatesCol
9/13 & 9/27
9/13 & 9/26
9月1日& 9/10 & 9/21
9/23

私は適切にインポートする列を取得するために、異なる何ができますか? DBMS = EXCELCSを使用すると、「サーバーへの接続に失敗しました」というエラーが表示されます。私の仕事のソフトウェア設定(64ビットSAS 9.4 with 32-bit Excel)では、DBMS = EXCELは機能しません。あなたが提供できるアドバイスをありがとうございます。

答えて

0

テキストと数値が混在するXLSXファイルの列をインポートすると、SASはその数値をRAW形式でインポートします。単純な算術演算を使用すると、生の日付のように見える文字列をExcelの基本日付からSASの基本日付に変換できます。したがって、SASのカウントが0からExcelが1からカウントし、Excelが1900がうるう年と判断したため1を減算するため、両方のシステムで使用される基準日の差を差し引くと、1を減算します。

sasdt = exceldt - ('01JAN1960'd - '01JAN1900'd +2) ; 

しかし01JAN1960'dは、あなたが今、あなただけの数字と文字列の間の違いを見分けるには少しロジックを必要とする

sasdt = exceldt + '01JAN1900'd - 2 ; 

に簡素化する可能性がちょうどゼロになる」からです。たとえば、文字列が1( '01JAN1900'd)と43,100(' 31DEC2017'd)の間の数値に変換され、MM/DD/YYYY形式の文字列に変換されるかどうかをテストできます。

52 data have ; 
53  input SeptemberDatesCol $30. ; 
54  put SeptemberDatesCol= @ ; 
55  if 0 <= input(SeptemberDatesCol,??32.) <= 43100 then 
56   SeptemberDatesCol = put(input(SeptemberDatesCol,??32.)+'01JAN1900'd-2,mmddyys10.) 
57  ; 
58  put '-> ' SeptemberDatesCol ; 
59 
60 cards; 

SeptemberDatesCol=9/13 & 9/27 -> 9/13 & 9/27 
SeptemberDatesCol=9/13 & 9/26 -> 9/13 & 9/26 
SeptemberDatesCol=9/01 & 9/10 & 9/21 -> 9/01 & 9/10 & 9/21 
SeptemberDatesCol=9/23 -> 9/23 
SeptemberDatesCol=42643 -> 09/30/2016 
SeptemberDatesCol=42643 -> 09/30/2016 
SeptemberDatesCol=42641 -> 09/28/2016 
if 0 <= input(SeptemberDatesCol,??32.) <= 43100 then 
    SeptemberDatesCol = put(input(SeptemberDatesCol,??32.),mmddyys10.) 
; 

だからあなたの例のデータは、に変換されます