簡體   English   中英

SAS CSV導入添加垃圾數據列

[英]SAS CSV import adds junk data column

我正在嘗試將數據導入SAS Enterprise Guide。 該文件是最初通過在Mac上保存Excel文檔生成的csv。 有三列,Date,DayOfYear和MonthOfYear。

我的導入代碼如下所示:

DATA indata;
    INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=',';
    INPUT Date YYMMDD10. DayOfYear MonthOfYear;
    FORMAT Date YYMMDD10.;
RUN;

問題是,這會導致日期列被一列移位后的所有內容。 示例輸出:

Date       | DOY | MOY
2017-01-01 |     |  1
2017-01-02 |     |  2
2017-01-03 |     |  3

我的hacky解決方案是添加一個名為junk的額外列來獲取所有空值,但我想盡可能地解決這個問題。 下面的黑客。

DATA indata;
    INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=',';
    INPUT Date YYMMDD10. junk DayOfYear MonthOfYear;
    FORMAT Date YYMMDD10.;
RUN;

Date       | junk | DOY | MOY
2017-01-01 |      |  1  |  1
2017-01-02 |      |  2  |  1
2017-01-03 |      |  3  |  1

我已經嘗試搞亂換行和回車無濟於事。 我輸入了DSD和DLM,但這並沒有改變任何東西。 似乎日期末尾有一個額外的隱形字符,它最終會出現在它自己的列中,但當我在十六進制編輯器中查看數據時,那里什么都沒有。 例如

ef bb bf 32-30 31 37 2d-30 31 2d 30-31 2c 31 ...

它直接從2017-01-01到逗號到1.所以沒有隱藏的字符。 我不確定這怎么可能發生。 這是我遇到這個問題的第二個文件所以我知道這不僅僅是一件事。

總結一下我的問題,如何避免在日期變量之后為垃圾創建額外的列?

您應該使用冒號(:)在輸入語句中應用信息,如下所示:

DATA indata;
    INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=',';
    INPUT Date : YYMMDD10. DayOfYear MonthOfYear;
    FORMAT Date YYMMDD10.;
RUN;

根據文件

:(冒號)格式修飾符使您可以使用列表輸入,但也可以在變量名稱后指定信息,無論是字符還是數字。 SAS讀取直到遇到空白列,定義的變量長度(僅限字符)或數據行的末尾(以先到者為准)。

如果您正在讀取分隔數據,那么您應該使用列表模式輸入。 您可以從刪除所有informats的INPUT語句或添加:在之前資料,請在修改INPUT ,使您還在使用體改列表模式聲明。 如果從輸入語句中刪除信息,則可以使用INFORMAT語句告訴SAS如何讀取日期變量。

data indata;
  infile '/sasdata/{path_to_file}' termstr=cr dsd truncover ;
  length Date DayOfYear MonthOfYear 8;
  input Date DayOfYear MonthOfYear;
  informat date yymmdd. ;
  format Date yymmdd10.;
run;

當您在讀取分隔數據行時告訴SAS使用格式化輸入時,可能會發生三件事,所有這些都很糟糕。

(1)你可以讀太少的字符,所以得到錯誤的結果。 這也將導致日期值的其余部分被讀取為下一列的值。

(2)讀取太多字符,因此嘗試將下一個分隔符作為日期的一部分或甚至是下一個值的一部分。 並且可能只留下下一列的下一個值的一部分。

(3)准確讀取正確的字符數,使日期正確,然后將光標位置保持在下一個分隔符之前。 然后,如果您使用DSD選項允許空值,這將使SAS認為下一個值為null並且基本上將該行的所有其余部分移位到錯誤的列中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM