2014-01-22 3 views
4

У меня есть более 3400 файлов CSV, размер которых варьируется от 10 КБ до 3 МБ. Каждый CSV-файл имеет это общее имя файла: stockticker-Ret.csv, где stockticker является биржевым тикером, таким как AAPL, GOOG, YHOO и т. Д., И возвращает акции в каждую минуту в определенный день. Сначала мой код SAS начинается с загрузки всех имен титров акций из файла stockticker-Ret.csv в наборе данных SAS. Я петлю над каждым тикером, чтобы загрузить соответствующий файл .csv в наборе данных SAS под названием want и нанести некоторые данные на want и сохранить окончательный набор данных want каждого тикера в наборе данных SAS под названием global. Как вы можете себе представить, этот процесс занимает много времени. Есть ли способ улучшить мой код DO LOOP ниже, чтобы ускорить этот процесс?SAS: Улучшение скорости цикла do с помощью импорта proc

/*Record in a sas dataset all the csv file name to extract the stock ticker*/ 
    data yfiles; 
    keep filename; 
    length fref $8 filename $80; 
    rc = filename(fref, 'F:\data\'); 
    if rc = 0 then do; did = dopen(fref); 
    rc = filename(fref); end; else do; length msg $200.; msg = sysmsg(); put msg=; did = .; end; 
    if did <= 0 then putlog 'ERR' 'OR: Unable to open directory.'; 
    dnum = dnum(did); 
    do i = 1 to dnum; filename = dread(did, i); /* If this entry is a file, then output. */ fid = mopen(did, filename); if fid > 0 then output; end; 
    rc = dclose(did); 
    run; 

/*store in yfiles all the stock tickers*/ 
    data yfiles(drop=filename1 rename=(filename1=stock)); 
    set yfiles; 
    filename1=tranwrd(filename,'-Ret.csv',''); 
    run; 

    proc sql noprint; 
    select stock into :name separated by '*' from work.yfiles; 
    %let count2 = &sqlobs; 
    quit; 


    *Create the template of the desired GLOBAL SAS dataset; 
    proc sql; 
    create table global 
    (stock char(8), time_gap num(5), avg_ret num(5)); 
    quit; 

    proc sql; 
    insert into global 
    (stock, time_gap,avg_ret) 
    values('',0,0); 
    quit; 

    %macro y1; 
    %do i = 1 %to &count2; 
    %let j = %scan(&name,&i,*); 
    proc import out = want datafile="F:\data\&j-Ret.csv" 
    dbms=csv replace; 
    getnames = yes; 
    run; 


    data want; 
    set want; .... 

    ....[Here I do 5 Datasteps on the WANT sasfile] 


/*Store the want file in a global SAS dataset that will contain all the stock tickers from the want file*/ 

    data global; 
    set global want; run; 

    %end; 
    %mend y1; 
    %y1() 

Как вы можете видеть глобальный набор данных SAS расширяет для каждого want набора данных, которые я храню в global.

+0

У файлов есть общий макет? – Joe

+0

да, они имеют раскладку для комикса – Plug4

ответ

4

Предполагая, что файлы имеют общий макет, их не следует импортировать с помощью PROC IMPORT или делать циклы. Вы должны прочитать их все с одним datastep. IE:

data want; 
length the_file $500; 
infile "f:\data\*.csv" dlm=',' lrecl=32767 dsd truncover firstobs=2 filename=the_file; 
input 
myvar1 myvar2 myvar3 myvar4; 
stock_ticker=scan(the_file,'\',-1); *or whatever gets you the ticker name; 
run; 

Теперь, если они не имеют одинаковых макетов, или есть некоторая сложность в читаешь, возможно, потребуется более сложное утверждение ввода, чем это, но почти всегда можно добиться его таким образом. Если цикл с большим количеством PROC IMPORT всегда будет неэффективным из-за накладных расходов IMPORT.

Если вам не нужен каждый CSV-файл в папке (и вы не можете написать маску для того, что вам нужно) или если у вас есть подмножество макетов, вы можете использовать опцию FILEVAR для чтения файлы из общего набора данных. Затем вы могли бы входить в различные входные инструкции, возможно, при необходимости.

data want; 
set yfiles; 
infile a filevar=filename; 
if filevar [some rule] then do; 
input ... ; 
end 
;else if ... then do; 
input ... ; 
end; 
run; 
+0

Спасибо за ответ. Мне нравится первый вариант, но проблема в том, что если я буду складывать все мои файлы csv в один набор данных SAS, чтобы начать с того, что я не могу различать между каждой «укладкой», так как я не знаю биржевой тикер (или ID, если вы предпочитаете), так как они не находятся в файле csv. Предложение относительно того, как я могу справиться с этим? – Plug4

+0

Да, вы можете получить имя файла из инструкции infile - обновите ответ. – Joe

+0

Превосходно выполняет эту работу. Я посмотрю, насколько хорошо он работает со всеми файлами данных – Plug4

Смежные вопросы