2016-02-24 30 views
0

從加載從CSV文件中特定的列我有一個問題要問, 我負責的一個小CSV數據庫,在那裏我需要執行一些計算與SAS,我已經出口Excel文件爲CSV格式和我想加載在SAS一些列的工作,我所遇到的問題是,加載後列不匹配的順序:這裏是代碼:顯示SAS

cars6.txt 
AMC,Concord,22,2930,4099 
AMC,Concord,22,2930,4099 
AMC,Pacer,17,3350,4749 
AMC,Spirit,22,2640,3799 
Buick,Century,20,3250,4816 
Buick,Electra,15,4080,7827 

代碼來輸出數據:

DATA cars6; 
    INFILE "/folders/myfolders/hbv1/cars6.txt" delimiter=','; 
    INPUT make $ model $ mpg $ weight price; 
RUN; 

TITLE "cars5 data"; 
PROC PRINT DATA=cars5(OBS=5); 
RUN; 

但我只想顯示列:製作,重量,價格? 那麼如何打印選定的列? 以及如何做到這一點,如果我有命名的列(例子不同於這一個只開始列名'變量'),但我試圖調用列y名稱,它打印他們,但與壞數據(薩斯基於列名正在有序列數據,而忽略列數據:。

input make $ model $ price $; 

感謝您

+0

請編輯您的帖子。你提到csv文件,但使用txt文件。你提到*輸出數據*但顯示輸入命令。您的數據是否包含列標題?最後,你是否考慮使用[proc import](http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a000308090.htm)? – Parfait

+0

我有列標題,但兩者都不起作用... – HappyMan

+0

請勿以文字及其數字閱讀mpg。 – Reeza

回答

0

考慮使用proc import並根據需要選擇列打印。 Proc導入可以處理保存爲.txt或.csv的逗號分隔文件。下面是兩種文本文件類型的示範:

%Let fpath = /folders/myfolders/hbv1; 

** READING IN TXT; 
proc import 
    datafile = "&fpath/cars6.txt" 
    out = Cars6 
    dbms = csv replace; 
run; 

** READING IN CSV; 
proc import 
    datafile = "&fpath/cars6.csv" 
    out = Cars6 
    dbms = csv replace; 
run; 

title "cars6 data"; 
proc print data=cars1(obs=5); 
    var make model price; 
run; 

或者,您也可以刪除變量和重新排序報表需要的列與retain

data CarsReport; 
    retain make model price; 
    set Cars6; 
    keep make model price; 
run; 

title "cars6 data"; 
proc print data=CarsReport(obs=5);  
run; 
+0

這是'完美',並反映了暱稱:)這工作非常好,我是搜索這個+++,我會試圖找出如何爲文本/ csv文件分配變量列,然後刪除我不需要的列 – HappyMan

+0

非常好聽!如果答案有效,請接受它以確認解決方案。 – Parfait

0

嘗試VAR聲明PROC PRINT

DATA cars6; 
    INFILE "/folders/myfolders/hbv1/cars6.txt" delimiter=',' firstobs=2; 
    INPUT make $ model $ mpg $ weight price; 
RUN; 

proc print data=cars6 noobs; 
var make weight price; 
run; 
+0

感謝您的回覆,但請分享完整的代碼嗎?以及如果我在CSV中有列名,它將如何改變? – HappyMan

+0

在'INFILE'語句中使用'FIRSTOBS = 2'。 SAS將開始讀取第二行的數據。 – DomPazz

+0

是的,我使用FIRSTOBS,但這不是爲我工作(也許我錯過了什麼)..從用戶Parfait工作的解決方案,無論如何謝謝 – HappyMan

0

如果你正在編寫你自己的程序讀取CSV文件,那麼您可能需要使用INFILE語句中的DSDFIRSTOBS=2選項。這將正確處理缺失值並跳過帶有變量名稱的行。您也可能想要添加TRUNCOVER選項以正確處理僅包含某些列的行。通過包含LENGTHATTRIB聲明來正確定義變量是值得的。否則,SAS將不得不猜測您是否需要數字或字符變量,以及從您首次引用它們的方式製作字符變量需要多長時間。

DATA cars6; 
    INFILE "/folders/myfolders/hbv1/cars6.txt" DSD DLM=',' FIRSTOBS=2 TRUNCOVER; 
    LENGTH make model $20 mpg weight price 8 ; 
    INPUT make model mpg weight price; 
RUN; 

但是你的程序需要知道文件中變量的順序。如果您的數據文件不一致,那麼您可以嘗試使用PROC IMPORT來讀取CSV文件。它可以從第一行獲取名稱並對變量類型進行有根據的猜測。

proc import datafile='/folders/myfolders/hbv1/cars6.txt' out=car6 replace dbms=dlm ; 
    delimiter=','; 
    getnames=yes; 
run; 

當使用您創建的SAS數據集中的數據時,可以使用SAS語言來選擇感興趣的列。語法將取決於您使用的過程。因此對於PROC PRINT使用VAR聲明。

proc print data=car6 ; 
    var price make model; 
run; 

併爲PROC FREQ使用TABLES聲明。

proc freq data=car6; 
    tables make model; 
run;