2016-12-05 99 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