2014-10-08 35 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

相關問題