SAS:导入包含日期的CSV文件

时间:2016-12-05 01:03:03

标签: csv sas

我目前正在尝试将压缩的csv文件导入SAS,我有3列日期,格式为YYYY-MM-DD。这个csv文件中的所有数据都是唯一的行,所以我认为它是一个字符串而不被识别为数字(对不起,我最近才开始编码,而且我还在学习很多基础知识)。 会发生什么事情是SAS假设8个字符并且它出现在2010-08-,基本上错过了这一天。 我尝试了几种方法来解决使用输入,但到目前为止还没有解决它。我要么得到一个空列,要么得到一个转换数字(例如52789 - 我猜这是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; 谢谢!

2 个答案:

答案 0 :(得分:0)

定义变量,然后就不会出现截断问题。

就个人而言,我发现首先按照我想要使用LENGTH语句读取变量的顺序来定义变量要容易得多。这是一个相当于SAS如何根据您当前的INPUT语句猜测如何定义变量的方法,但我已将所有的... _ date变量更改为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语句可以非常简单,因为您可以通过在第一个和最后一个变量名之间放置--来使用位置变量列表。

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.;

答案 1 :(得分:0)

默认情况下,SAS字符串设置为8个字符,在您的情况下太短。

您可以使用LENGTH和INFORMAT语句指定长度以及您希望如何读取数据

在INFILE和INPUT之后,您可以添加LENGTH和/或INFORMAT语句。

INFORMAT指定变量在读取时的格式(在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.;