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的新手,非常感谢任何帮助:)
答案 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