2014-10-08 56 views
2

除了modify声明之外,是否还有其他方法可以修改SAS数据集的内容(即更改值或添加或删除行或列)不涉及涉及在工作中创建临时文件,然后替换整个原始文件?我可以在不创建临时文件的情况下修改现有的SAS数据集吗?

相关的问题:如果我有一个单一的proc sql有一个create table声明和几个insert声明,所有针对同一个表,将SAS最终执行期间覆盖输出表几次,还是足够聪明来完成所有的一次写入?假设我没有连接到任何其他DBMS。

由于2人已经张贴了这个,下面是不是一个有效的答案:

data lib.dsn; 
    set lib.dsn; 
    /*Insert logic here*/ 
run; 

如果你这样做,SAS创建一个临时文件,一旦数据步骤完成替换原始lib.dsn 。如果您中断这种数据步骤,日志中将会出现错误,但原始数据集将保持不变。

+1

恕我直言,只有一个办法,找出:(?)填补或禁用saswork看看怎么了。 SAS不符合ACID标准,它可能依靠主机操作系统的文件系统操作来模拟其中的一部分)当然,还有拼接锁定。 – wildplasser 2014-10-08 23:37:35

+0

我想我可以删除自己对工作目录的写入权限,看看SAS是否能够修改其他地方的数据集 - 感谢您的建议。 – user667489 2014-10-08 23:46:45

回答

1

PROC SQL; UPDATE

更新行与PROC SQL; DELETE

删除添加具有PROC APPENDPROC SQL; INSERT

+0

您能否引用源代码或提供测试结果,指示SAS更新目标表而不是创建临时文件? – user667489 2014-10-09 15:55:05

0

我找到了一个 - 但有没有其他类似的方法来覆盖行或添加/删除变量?从帮助页面的append声明:

的追加声明绕过数据的处理在原来 数据集,并直接增加了新的观测到原来的 数据集的末尾。

发现了另一个 - 似乎remove语句可以在我想要的方式删除行,但只有当我使用modify声明,我已经知道了。

-1

原创回答: 添加/删除列或添加/删除行都可以通过数据步骤完成。

drop语句从数据集中删除变量original_variable_A。 行“new_variable = 25;”为数据集添加一个新变量。 do循环添加新行。 where子句删除任何不满足所列条件的行。

data libname.permanent_data; 
    set libname.permanent_data; 
    drop original_variable_A; 
    new_variable = 25; 
    do i = 1 to 2; 
     original_variable_B = 3; 
     new_variable = 2; 
     output; 
    end; 
    where original_variable_B <= 50; 
run; 

修订答: 我认为有可能在“临时文件”的意义来来混淆。如果通过临时文件表示工作目录中的数据集,我的原始答案就足够了。但是,如果您的意思是标准SAS数据集创建的永久文件,如您在评论中所述......我认为您可以在视图上对proc数据集进行一些操作,这些视图肯定不会创建临时文件。 https://support.sas.com/rnd/base/Tipsheet_DATASETS.pdf

+0

这将创建一个临时文件,它将替换原始文件AFAIK。 – Reeza 2014-10-09 01:39:14

+0

这不能正确回答问题。 – Joe 2014-10-09 03:57:06

+0

经过反思,如果您创建视图而非数据集,这在技术上可能是正确的答案。 – user667489 2014-10-09 07:26:12

-1

是的。 说我是否在包含名为customer_addr的客户地址的位置'C:\ Temp'中有一个数据集。 您只需在数据步骤中引用相同的库和数据集,它将覆盖现有数据集而不是将其放入Work库。

libname Customers 'C:\Temp'; 
data Customers.customer_addr; 
set Customers.customer_addr; 
*do some logic here to remove or filter rows/columns; 
run; 
+0

错误 - 如果您这样做,SAS会创建一个临时文件,然后在执行完成后替换原始文件。 – user667489 2014-10-09 07:31:14

相关问题