从CSV文件更新本地SAS表

时间:2014-06-12 03:37:54

标签: csv import sas

3并有一张我需要更新的表格。根据我的理解,您可以执行以下操作:

data new_table;
  update old_table update_table;
  by some_key;
run;

我的问题(我有几个......)是我从CSV文件导入“update_table”并且格式与“old_table”不匹配,因此更新失败。

我尝试使用带有零观察的proc sql create table从“old_table”创建“update_table”,这创建了正确的类型/格式,但是我无法在不替换它的情况下插入数据。

我遇到的另一个主要问题是存在大量列(480)和自定义格式,并且我遇到了脚本的6000个字符限制。

我是SAS的新手,非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:3)

听起来您需要使用数据步骤来读取CSV。那里有很多论文解释如何做到这一点,所以我不打算在这里介绍它。这将允许您指定每个字段的格式(数字/字符)。这里的好处是你已经知道它们需要的格式(来自你现有的数据集),所以你可以很容易地创建这个读取。

让我们说你的数据是这样的:

data have;
informat x date9.;
input x y z $;
datalines;
10JAN2010 1 Base
11JAN2010 4 City
12JAN2010 8 State
;;;;
run;

现在,如果您具有相同格式的CSV,则可以通过从上述数据集生成输入代码来读取它。您可以使用PROC CONTENTS执行此操作,也可以使用与dictionary.tables具有相同信息的PROC CONTENTS生成该文件。

proc sql;
  select catx(' ',name,ifc(type='char', '$' ,' '))into :inputlist 
   separated by ' '
   from dictionary.columns
   where libname='WORK' and memname='HAVE';
  select catx(' ',name,informat) into :informatlist separated by ' '
   from dictionary.columns
   where libname='WORK' and memname='HAVE'
   and not missing(informat);
quit;

以上是两个例子;它们可能或可能不足以满足您的特殊需求。

然后你就像这样使用它们:

data want;
infile datalines dlm=',';
informat &informatlist.;
input &inputlist.;
datalines;
13JAN2010,9,REGION
;;;;
run;

(显然你会使用你的CSV文件而不是数据,只是在这里用作例子。)

关键是您可以使用原始数据集中的元数据编写数据步骤代码。

答案 1 :(得分:0)

我今天需要这个,所以我做了一个宏:https://core.sasjs.io/mp__csv2ds_8sas.html

它不会包装输入语句,因此如果您有批处理行的长度限制,它可能会中断许多列。如果有人希望我修复此问题,请提出一个问题:https://github.com/sasjs/core/issues/new