2016-12-05 184 views
0

目前我正在試圖導入壓縮CSV文件導入SAS和我有3列寫在格式YYYY-MM-DD日期導入CSV文件。這個csv文件中的所有數據都是獨特的行,所以我認爲它是一個字符串,不被識別爲數字(抱歉,我最近纔開始編碼,而且我仍然在學習很多基礎知識)。 會發生什麼情況是SAS假定8個字符,它提供了2010-08-,基本上錯過了一天。 我嘗試了幾種方法來解決使用輸入,但迄今沒有解決它。我要麼得到一個空列或與轉換號碼(如52789 - 我想這是SAS使用作爲參考的是1960年至今) 我希望你們能給我一些提示如何完成這件事。 的代碼是:SAS:與日期

FILENAME IPC3data zip 'C:\Users\********\IPC3data.zip' 
member='tls201_appln.csv'; 
DATA newdata; 
    INFILE IPC3data DLM=';' DSD FIRSTOBS=2; 
    INPUT appln_id $ appln_auth $ appln_nr $ appln_kind $ appln_filing_date $ appln_filing_year $ appln_nr_epodoc $ appln_nr_original $ ipr_type $ internat_appln_id $ int_phase $ reg_phase $ nat_phase $ earliest_filing_date $ earliest_filing_year $ earliest_filing_id $ earliest_publn_date $ earliest_publn_year $ earliest_pat_publn_id $ granted $ docdb_family_id $ inpadoc_family_id $ docdb_family_size $ nb_citing_docdb_fam $ nb_applicants $ nb_inventors; 
Filing_date = input(appln_filing_date, ANYDTDTE10.); 
put Filing_date=YYMMDD10.; 
Early_filing_date = input(earliest_filing_date, ANYDTDTE10.); 
put Early_filing_date=YYMMDD10.; 
Early_publn_date = input(earliest_publn_date, ANYDTDTE10.); 
put Early_publn_date=YYMMDD10.; 

RUN; 謝謝!

回答

0

定義的變量,那麼你不會有截斷的問題。

我個人覺得更容易首先定義的順序變量,我想用長度語句來閱讀。下面是等同於SAS如何基於當前INPUT語句來猜測如何定義變量的方法,但我已將所有..._日期變量全部更改爲10個字符的字符串,而不是默認的8個字符。你可能應該改變一些其他變量的長度(或者甚至是類型)。

LENGTH appln_id appln_auth appln_nr appln_kind $8 appln_filing_date $10 
     appln_filing_year appln_nr_epodoc appln_nr_original $8 
     ipr_type internat_appln_id int_phase reg_phase nat_phase $8 
     earliest_filing_date $10 earliest_filing_year earliest_filing_id $8 
     earliest_publn_date $10 earliest_publn_year earliest_pat_publn_id $8 
     granted docdb_family_id inpadoc_family_id docdb_family_size $8 
     nb_citing_docdb_fam nb_applicants $8 
     nb_inventors 8 
; 

那麼輸入語句可以是非常簡單的,因爲你可以通過把一個--第一個和最後一個變量名之間用一個位置變量列表。

input appln_id -- nb_inventors ; 

但實際上日期是SAS中的數字。您只需要使用特殊的信息和格式,以便SAS知道如何從人們可讀的文本字符串進行翻譯。因此,通過改變長度從$10更改日期的變量號碼8並附加適當的資料,請與SAS將它們存儲爲日期,而不是字符串。

informat appln_filing_date earliest_filing_date earliest_publn_date yymmdd.; 
format appln_filing_date earliest_filing_date earliest_publn_date yymmdd10.; 
+0

親愛的湯姆的日期格式和類型,感謝長度評論 - 這解決了這個問題!對,對於某些id列,我也需要超過8個空格。我知道這個技巧,但是沒有想到它......但是,如果我添加了信息/格式部分,它總是會給我一個錯誤提示「信息$ yymmdd。未找到或無法加載。」鑑於長度聲明給了我完整的日期,我還不確定是否還需要添加? – Annina

+0

您必須使用與變量類型相匹配的信息。由於你的變量是字符SAS正在尋找一個將生成字符結果的信息。因此錯誤消息中的額外$。確保將變量定義爲數字。 – Tom

0

默認情況下,SAS字符串設定爲8個字符,這是你的情況太短。

您可以使用長度和INFORMAT語句指定長度,要如何在數據

INFILE後輸入,您可以添加您的長度和/或INFORMAT語句讀取。

INFORMATs指定一個變量是如何被格式化時被讀取它(在CSV文件),同時FORMATS控制格式如何顯示在SAS。

你並不需要閱讀所有的變量作爲字符變量。您可以指定在

FILENAME IPC3data zip 'C:\Users\********\IPC3data.zip' member='tls201_appln.csv'; 

DATA newdata; 

INFILE IPC3data DLM=';' DSD FIRSTOBS=2; 



INPUT appln_id $ appln_auth $ appln_nr $ appln_kind $ appln_filing_date appln_filing_year $ appln_nr_epodoc $ appln_nr_original $ ipr_type $ internat_appln_id $ int_phase $ reg_phase $ nat_phase $ earliest_filing_date earliest_filing_year $ earliest_filing_id $ earliest_publn_date earliest_publn_year $ earliest_pat_publn_id $ granted $ docdb_family_id $ inpadoc_family_id $ docdb_family_size $ nb_citing_docdb_fam $ nb_applicants $ nb_inventors; 


INFORMAT appln_filing_date earliest_filing_date earliest_publn_date anydtdte.; 
FORMAT appln_filing_date earliest_filing_date earliest_publn_date DATE9.; 
+1

將INFORMAT和FORMAT移至INPUT語句後面。否則,你迫使列出的變量成爲數據集中的第一個變量。 INPUT語句仍然可以正常工作,因爲INFORMAT和FORMAT語句出現並不重要,因爲它們不是可執行語句。 – Tom

+0

親愛的Reeza,謝謝你的回答!但是,我總是收到錯誤消息「格式$ DATE未找到或無法加載。」在信息和格式行上... – Annina

+0

如果您指定了日期信息,您必須確保$從輸入語句中移除。 – Reeza