2013-07-19 58 views
1

我〜2300 CSV文件和colunm 1變量名是每個CSV文件不同的合併多個CSV文件到單個數據集。我想panelistID(colunm 2)和第1列運行頻率合併所有文件以獲得每個CSV文件的頻率。請有人可以幫忙嗎?如何使用SAS

示例文件佈局下面:

File1 

mat1_pen1, panelistID 

0, 10075001 

20, 10086001 

44, 10086002 

10, 10096001 

File2 

mat2_pen2, panelistID 

74, 10118002 

40, 10118003 

77, 10128001 

77, 10128003 


file 3 

mat3_pen4, panelistID 

77, 10128003 

51, 10137001 

0, 10148001 

0, 10148002 

0, 10157001 
+0

你可以發佈你已經嘗試過任何代碼或說明你已經嘗試?這將有助於其他人回答你的問題。 – dethtron5000

+1

我可以投票選出「讓誰認爲這是一個好主意,讓你被炒魷魚2300個CSV文件的人」? – Joe

回答

4

只需使用通配符的infile聲明中的所有文件的讀取,並選項可將當前文件存儲在一個臨時變量_f,它存儲到f

然後操縱fvar相應。

 
data big ; 
    length _f f $256. ; 
    infile "*.csv" truncover filename=_f dlm=',' ; 
    f = _f ; 
    input var 
     panellistID 
     ; 
run ; 
+0

問題是,我看問題的方式,他希望保持在列標題中列出的原始變量名稱;該解決方案將它們全部保存在同一列中。並將字符和數字數據與列標題混合。這些問題都可以通過一些轉置,轉換等來解決。 –

1
filename mycsv "*.csv"; 

data mydataset(drop=tmp); 
    infile mycsv dsd dlm=',' eov=eov; 
    retain mat_pen_id; 

    if _n_ = 1 or eov then do;  *when using wildcard-concatenated input files, ; 
     input mat_pen_id $20. tmp $20.; *eov is true for first line of second file.; 
     eov = 0; 
    else do;       * _n_ =1 is true for first line of first file only; 
     input mat_pen panelistID; 
    end; 
run; 

proc sort data= mydataset; 
    by panelistID; 
run; 

proc transpose 
    data=mydataset out=wide_data; 
     by panelistID; 
     id mat_pen_id; 
     var mat_pen; 
     run; 

proc print data=wide_data; 
run; 

這會給你一個名爲wide_data喜歡數據集:

obs panelistID mat1_pen1 mat2_pen2 mat3_pen3 etc 

1  10075001  0  22   33