मैं वर्तमान में एसएएस में कुछ सौ फाइलों का आयात कर रहा हूं, जिसमें सभी पथों और रुचि के फ़ाइलनाम वाली तालिका के आधार पर लूपेड इनफाइल स्टेटमेंट का उपयोग किया गया है। अब मैं जो करना चाहता हूं वह प्रत्येक फ़ाइल की विशेषताओं को आयात करने के लिए उपयोगकर्ता नाम प्राप्त करने के लिए है जिसने प्रत्येक फ़ाइल बनाई है। मैं 'स्वामी' चर प्राप्त करने के लिए finfo का उपयोग करने का प्रयास कर रहा हूं लेकिन यह सुनिश्चित नहीं है कि यह उपयोग करने के लिए सही है या नहीं। मैं जिस कोड का उपयोग कर रहा हूं वह इस तरह दिखता है:

filename fileref 'file.csv';                                                                                                          
data a(drop=fid);                                                                                                                       
infile fileref truncover obs=1;                                                                                                       
fid=fopen('fileref');     
fnum = foptnum(fid); 
Bytes=finfo(fid,'File Size bytes)');                                                                                                 
crdate=finfo(fid,'Create Time');                                                                                                      
moddate=finfo(fid,'Last Modified');  

owner=foptname(fid,2);
owner2 = finfo(fid,owner); 
Owner1 = finfo(fid,'Owner');
run; 

किसी भी तरह की सहायता का स्वागत किया जाएगा।

0
Sherazon 11 मई 2017, 16:22

2 जवाब

सबसे बढ़िया उत्तर

पहले उल्लेख किए गए dir /q दृष्टिकोण का उपयोग करके नीचे एक उदाहरण दिया गया है। फ़ाइल विशेषताओं को बनाए रखते हुए एक फ़ोल्डर के भीतर कई फाइलों में पढ़ना उपयोगी होना चाहिए।

%let target_dir = %str(C:\csv_files);
filename DrLst pipe "dir ""&target_dir.\*.csv"" /Q";
%let DELIM   = ' ' ;
data readFiles;
    length infile_path
           filename $255 
           line $1024 
           owner $17 
           temp $16 ;
    infile DrLSt length=reclen;
    input line $varying1024. reclen;
    /*For each csv file found, obtain the file information and read the file contents*/
    if    index(line,"<DIR>") eq 0 and substr(line,1,1) in('0','1') then do;
        createDate = input( scan( line, 1, &DELIM ), mmddyy8. ) ;
        createTime = input( scan( line, 2, &DELIM ), time10. ) ;
        size       = input( scan( line, 4, &DELIM ), best8.) ;
        owner      =        scan( line, 5, &DELIM ) ;

        /*Parsing the filename is tricky*/
        filename = scan( line, 6, &DELIM ) ;
        ndx = index( line, scan( filename, 1 )) ;
        filename = substr( line, ndx ) ;

        /*Now read in the found csv file*/
        infile_path = cat("&target_dir.\",strip(filename));
        infile temp filevar=infile_path dsd dlm=',' end=temp_end;
        do until (temp_end);
            input csvVar1 : $char50.
                  vscVar2 : $char50.;
            output;
        end;
    end;
    drop ndx line temp;
run;
0
Hugs 12 मई 2017, 21:55

फ़ाइल स्वामी का उपयोगकर्ता नाम आपके परिवेश में फ़ाइलों के लिए finfo फ़ंक्शन के माध्यम से पहुंच योग्य नहीं हो सकता है। आप निम्न को चलाकर किसी फ़ाइल के लिए उपलब्ध आइटम्स के नाम सूचीबद्ध कर सकते हैं:

data _null_;
fileref = "myfile";
rc = filename(fileref,"C:\temp\class.csv");
put rc=;
fid = fopen(fileref);
put fid=;
nopts = foptnum(fid);
do i = 1 to nopts;
  optname = foptname(fid,i);
  put optname=;
end;
rc = fclose(fid);
run;

यदि file owner या ऐसा कुछ आपके परिवेश में फ़ाइलों के लिए सूचीबद्ध नहीं है तो यह तरीका काम नहीं करेगा। आपको नाम किसी अन्य तरीके से प्राप्त करने की आवश्यकता होगी, उदा। विचाराधीन फ़ाइल के लिए एक dir /Q कमांड को पाइप करके।

फ़ाइल नियंत्रण कार्यों का उपयोग करके इसका एक उदाहरण होगा:

data _null_;
fileref = "myfile";
/*
The line output by the command below will look something like this:
28/09/2016  13:29               437 user                   class.csv
*/
rc = filename(fileref,"dir /q c:\temp\class.csv | findstr class.csv",'pipe');
fid = fopen(fileref,'s');
rc = fread(fid);
length junk $100 username $32;
/*fget reads 1 word at a time, so throw away the 3 before the username*/
do i = 1 to 3; 
rc = fget(fid, junk);
end;
rc = fget(fid, username);
rc = fclose(fid);
put _all_;
run;

यदि आप वास्तव में उत्सुक हैं, तो प्रत्येक फ़ंक्शन कॉल को %sysfunc() में लपेटकर, उपरोक्त सभी को शुद्ध मैक्रो कोड में दोहराना भी संभव है।

0
user667489 12 मई 2017, 13:11