2014-07-02 174 views
1

我已將SAS數據集導出到.txt文件中。我如何獲得所有這些文本文件的名稱和記錄數?這是創建一個表格/報告,它將顯示哪些SAS數據集導出到文本文件以及每個文本文件有多少記錄。如果這些文件是SAS數據集,但我無法找到.txt文件中的任何內容,我知道如何做類似的事情。獲取文件夾中.txt文件的名稱和記錄數

SAS中的導出過程會生成導出結果和每個文件中的記錄數。但我正在爲40-50個國家的多個文件進行導出。所以我無法查看導出日誌的每一行以確定多個文件的名稱和記錄數。並打開每個文件以獲得記錄計數是不是一個選項:)

我需要有一個報告,最好以表格格式列出導出的文本文件的名稱和每個文件的記錄計數。

謝謝克里斯,爲您的建議和代碼。但是沒有主數據集。讓我再解釋一下我的問題:

Country A has 10 different SAS datasets - Adata01.sas7bdat....Adata10.sas7bdat 
Country B has 15 different SAS datasets - Bdata02.sas7bdat...Bdata15.sas7bdat 
...and so on. 

我需要這些數據集的出口與UTF8編碼的文本文件 - 這是我做的事。所以,現在我有:

Country A - Adata01.txt, Adata02.txt....Adata10.txt 
Country B - Bdata02.txt, Bdata03.txt...Bdata15.txt 

的選項我能想到的是 - 掃描導出日誌,只是提取寫入文本文件中的記錄文本文件和#的名稱。我想要的是這樣的:

Sas Data   Exported Text Data  # of Records 
Adata01.sas7bdat Yes  Adata01.txt 8000 

這樣做的任何好方法?

回答

1

如果您願意接受SAS的多少條記錄(即信任日誌)的話,您可以解析日誌。下面是一個例子;它可能會或可能不適合您的具體情況,但它應該是一個有用的指導。

proc printto log="d:\temp\log.txt" new; *put log out to a file somewhere; 
run; 
*here is your proc export; 
proc export data=sashelp.class outfile="d:\temp\test.txt" dbms=tab replace; 
run; 
proc printto; 
run; 

data log_parse; 
infile "d:\temp\log.txt"; *your log file; 
input @;     *open for input; 
if find(_infile_,'were written') then do; *if we are on the right line; 
    input 
     @"NOTE: " records     /*@"str" is a useful kind of input here */ 
     @"the file " filename :$50.  /*"the file " is in case you have 'file' in your filename. You may want to parse this further (for example, remove quotes)*/ 
     ; 
    output; 
end; 
run; 
+0

請注意,這假定您需要實際寫出的行數;記錄數(SAS中)在_EFIREC_自動宏變量中可用。如果您在每次導出後將其保存,則可以將其用作比較。 – Joe

+0

這可能會起作用 - 讓我做一些更改並回復給您。謝謝喬! – rom

+0

這工作,再次感謝@Joe! – rom

0

我對SAS數據集並不熟悉,但是,這裏有一些想法,假設您無法從SAS內部獲取導出詳細信息。但希望這些信息是可用的,有人會告訴你如何得到它。

如果不是這裏是一個非常簡單的解決方案: 如果導出包含每個項目的1行數據,只需打開文件並獲得一個行數。 要獲得導出數據集的數量,請使用導出的臨時文件夾,然後獲取文件夾中文件的數量。當你數它們時,將它們移動到人們期望它們的文件夾(所以你不要數它們兩次)。

這樣,您就得到了每個導出文件的名稱,每個文件的行數(即導出的項目數),位置(因爲您將它移出臨時位置,您知道將位置移至臨時位置),以及在這個過程中有多少出口。

我在這裏做了一些簡單的假設。假設以上都不合適,請發佈一些更多的細節,您會得到更多的建議。

0

爲什麼不從創建文本文件的SAS數據集中獲取#條記錄?

假設您將每個國家/地區的所有記錄導出到每個國家/地區的文本文件中,則只需在主數據集上按國家/地區執行proc freq即可。這會給每個國家輸出文件中的#個記錄。

 
/* Generate counts by country */ 
proc freq data=master noprint ; 
    table COUNTRY /out=f_countries ; 
run ; 

data _null_ ; 
    set f_countries end=eof ; 
    call symputx(cats('CTRY',_n_),COUNTRY) ; 
    if eof then call symputx('CTRYN',_n_) ; 
run ; 

%MACRO EXPORT_LOOP ; 
    %DO I = 1 %TO &CTRYN ; 
    proc export data=master (where=(COUNTRY="&&CTRY&I")) outfile="c:\Country &&CTRY&I...txt" dbms=tab ; 
    run ; 
    %END ; 
%MEND ; 

%EXPORT_LOOP ; 

title "Record counts by Country, output file = c:\Country <country>.txt" ; 
proc report data=f_countries ; 
run ; 
+0

導出或轉換可能導致截斷或其他不一致,因爲我正在對文本文件執行UTF-8編碼。這就是我需要從文本文件中獲取記錄數的原因。 – rom

+0

SAS日誌將指示寫入文本文件的記錄數,與SAS數據集中的#輸入記錄相同。我不認爲這會反映任何編碼「不一致」。唯一的方法就是將文本文件讀回SAS。 –

+0

@rom你是否願意相信SAS會放出它所說的行(例如,如果你可以讀日誌,你會相信它裏面的信息)? – Joe

相關問題