2015-05-07 8 views
5

में% let स्टेटमेंट के बाद अनियमित किया गया है, मैं एसएएस में कुछ बनाना चाहता हूं जो एक्सेल लुकअप फ़ंक्शन की तरह काम करता है। असल में, मैंने मैक्रो चर var1, var2, के लिए मान सेट किया है ... और मैं ref तालिका के अनुसार अपना इंडेक्स नंबर खोजना चाहता हूं। लेकिन मुझे डेटा चरण में निम्नलिखित संदेश मिलते हैं।मैक्रो वैरिएबल sas

NOTE: Variable A is uninitialized. 
NOTE: Variable B is uninitialized. 
NOTE: Variable NULL is uninitialized. 

जब मैं चर &num1, &num2 प्रिंट, मैं कुछ भी नहीं मिलता है। मेरा कोड यहाँ है।

data ref; 
    input index varname $; 
    datalines; 
0 NULL 
1 A 
2 B 
3 C 
; 
run; 

%let var1=A; 
%let var2=B; 
%let var3=NULL; 

data temp; 
    set ref; 
    if varname=&var1 then call symput('num1',trim(left(index))); 
    if varname=&var2 then call symput('num2',trim(left(index))); 
    if varname=&var3 then call symput('num3',trim(left(index))); 
run; 

%put &num1; 
%put &num2; 
%put &num3; 

मैं, &num1, &num2 के लिए सही मान प्राप्त कर सकते हैं .. अगर मैं if-then बयान में varname='A' टाइप करें। और यदि मैं बाद में कथन को varname=&var1 पर बदलता हूं, तो भी मुझे आवश्यक आउटपुट मिल सकता है। परन्तु ऐसा क्यों? मैं वास्तविक स्ट्रिंग मान इनपुट नहीं करना चाहता हूं और उसके बाद हर बार परिणाम प्राप्त करने के लिए इसे वापस मैक्रो चर में बदलना चाहता हूं।

+1

मैं आप कोई खोज करते सुझाव देंगे कि यह एक प्रारूप lookup कहा जाता है बनाता है एसएएस में इस तरह की चीज करने के कई अलग-अलग तरीकों पर एसएएस पेपर खोजने के लिए http://www.lexjansen.com/ पर "लुकअप" के लिए। – DWal

उत्तर

8

तात्कालिक समस्या

आप उन्हें स्ट्रिंग स्थिरांक के रूप में इलाज के लिए एसएएस चाहते दोहरे उद्धरण में अपने मैक्रो चर रैप करने के लिए जरूरत के लिए समाधान। अन्यथा, यह उनके डेटा चरण में पाठ के किसी अन्य यादृच्छिक बिट्स के समान ही व्यवहार करेगा।

वैकल्पिक रूप से, आप उद्धरण शामिल करने के लिए मैक्रो वर्र्स को फिर से परिभाषित कर सकते हैं।

एक और विकल्प के रूप में, आप symget या resolve फ़ंक्शंस का उपयोग कर सकते हैं, लेकिन इन्हें आमतौर पर तब तक आवश्यक नहीं किया जाता है जब तक आप एक मैक्रो वैरिएबल नहीं बनाते और उसी डेटा चरण में फिर से इसका उपयोग नहीं करते। यदि आप डबल कोट्स के प्रतिस्थापन के रूप में उनका उपयोग करते हैं तो वे बहुत अधिक CPU का उपयोग करते हैं क्योंकि वे डिफ़ॉल्ट रूप से प्रति पंक्ति एक बार मैक्रो वर्र्स का मूल्यांकन करेंगे - आम तौर पर, आपके कोड निष्पादित होने से पहले, संकलन समय पर मैक्रो वर्र्स का मूल्यांकन एक बार किया जाता है।

एक बेहतर तरीका?

आप जिस तरह के लुकअप कर रहे हैं, उसके लिए आपको वास्तव में एक डेटासेट का उपयोग करने की आवश्यकता नहीं है - आप इसके बजाय एक कस्टम प्रारूप परिभाषित कर सकते हैं, जिससे आप इसका उपयोग कैसे कर सकते हैं में अधिक लचीलापन देता है। जैसे

proc format; 
    value lookup 
    1 = 'A' 
    2 = 'B' 
    3 = 'C' 
    other = '#N/A' /*Since this is what vlookup would do :) */ 
    ; 
run; 

तो फिर तुम इतने तरह के प्रारूप का उपयोग कर सकते हैं::

%let testvar = 1; 
%let testvar_lookup = %sysfunc(putn(&testvar, lookup.)); 

या एक डेटा चरण में:

data _null_; 
    var1 = 1; 
    format var1 lookup.; 
    put var1=; 
run; 
+0

मैं देखता हूं। विकल्प पेश करने के लिए धन्यवाद! – Yimai

+2

अच्छा जवाब। आप यह भी समझा सकते हैं कि डेटासेट से प्रारूप कैसे बनाएं (उपयोगकर्ता को पहले से ही इस डेटा को डेटासेट में रखा जा सकता है)। – Joe