2012-10-24 1 views
4

Есть ли процедура или функция SAS, которая может быть использована для копирования текста файла из одного места в другое?Использование SAS для копирования текстового файла

Конечно, это может быть достигнуто с помощью команд OS (% sysexec copy), но, безусловно, должен быть OS-агностический способ сделать это?

Из того, что я могу сказать, глядя на документации, прок копия (или прок cport) относится только к файлам SAS ..

ответ

8

Самый простой способ что-то вроде:

data _null_; 
    infile 'c:\input.txt'; 
    file 'c:\output.txt'; 
    input; 
    put _infile_; 
run; 

Метод, представленный RawFocus будет копировать любой файл, в двоичной системе, один байт в то время, от входа до выхода. Для текстового файла это необязательно, и выполнение вышеуказанного будет копировать файл по одной строке за раз. Вы, возможно, придется быть немного осторожным с рекордными длинами, я считаю, что длина записи по умолчанию является 256, так что вам может понадобиться установить явный вариант

lrecl=32767 

или аналогичные на infile заявление, как в

infile 'c:\input.txt' lrecl=32767; 
5

Кажется Chris Hemedinger есть ответ!

/* these IN and OUT filerefs can point to anything */ 
filename in "c:\dataIn\input.xlsx"; 
filename out "c:\dataOut\output.xlsx"; 

/* copy the file byte-for-byte */ 
data _null_; 
    length filein 8 fileid 8; 
    filein = fopen('in','I',1,'B'); 
    fileid = fopen('out','O',1,'B'); 
    rec = '20'x; 
    do while(fread(filein)=0); 
    rc = fget(filein,rec,1); 
    rc = fput(fileid, rec); 
    rc =fwrite(fileid); 
    end; 
    rc = fclose(filein); 
    rc = fclose(fileid); 
run; 

filename in clear; 
filename out clear; 

Спасибо Крис

+0

Raw, вы должны теперь иметь возможность отметить свой ответ как можно скорее, возможно, так как иначе это выглядит так, как будто оно не ответило :) Кроме того, я предлагаю вам добавить это в FAQ, поскольку это общепринятая концепция (IMO, для очень ограниченного определения «общего»). – Joe

+0

Готово - спасибо Джо. Я хотел бы убедиться, что сначала не было «лучших» ответов, хотя, как было бы приятно, нахальный, отмечая мой собственный ответ «правильно», если это так! Кроме того, на что вы ссылаетесь, добавьте это в FAQ? –

+0

Я имел в виду неточное понимание того, как часто задаваемые вопросы: – Joe

2

Для SAS 9.4 и вперед используйте функцию FCOPY. Используйте recfm = n (n для ни одного или двоичного) для выполнения истинной копии.

filename src "path-to-src" recfm=n; 
filename dst "path-to-dst" recfm=n; 
%let rc = %sysfunc(FCOPY(src,dst)); 
%put %sysfunc(SYSMSG()); 

Если filerefs не использовать recfm = п вариант F КОПИРОВАТЬ будет рассматривать их как текстовый файл, и, таким образом, зависит от управляющих символов и конец маркеров файлов.