我正在尝试创建一个增量构建的哈希变量。我要解决的具体问题是,我有一列货币对:
|--------------------|
| ID | CurrencyPair |
|----|---------------|
| 1 | USD/GBP |
| 2 | GBP/USD |
| 3 | USD/BRL |
| ...| ... |
我希望第1行的货币对和第2行的货币对(美元/英镑)和(英镑/美元)被认为是相同的。因此,我试图实现以下算法:
- 创建空列
CurrencyPairRecode
- 创建哈希变量
declare hash h(); h.defineKey('k'); h.defineData('d');
对于每一行数据,查找哈希表中是否存在货币对。如果是,则
CurrencyPairRecode
的值与CurrencyPair
的值相同rc = h.Check(key: currencyair)如果(rc=0)则CurrencyPairRecode = CurrencyPair
如果没有,检查翻转的货币对是否在哈希表中。如果是,则
CurrencyPairRecode
为翻转值CALL CATX("/",翻转,SUBSTR(settment_exchange_rate_basis, 4,3),SUBSTR(settment_exchange_rate_basis, 1,3));
flip_rc = h.Check(key: FLIPPED);IF (flip_rc = 0) THENcurrencyairrecode = flipped;
如果两者都不是,则
CurrencyPairRecode
与CurrencyPair
相同,并将CurrencyPair
添加到哈希表中。IF (rc^=0 AND flip_rc^= 0) THENadd (key: currencyair, data: 1);CurrencyPairRecode = CurrencyPair
我已经尝试过这个代码,但得到错误。我是SAS的新手,所以不知道如何排除故障。
我使用的一般方法是始终按排序顺序存储货币对。当顺序真的不相关时(因为你不需要跟踪它),这一点特别有吸引力。
我会这样做。
data have;
input ID CurrencyPair $;
datalines;
1 USD/GBP
2 GBP/USD
3 USD/BRL
;;;;
run;
data for_hash;
set have;
array curs[2] $ _temporary_;
curs[1] = scan(currencyPair,1,'/');
curs[2] = scan(currencyPair,2,'/');
call sortc(of curs[*]);
new_pair = catx('/',of curs[*]);
put _all_;
run;
然后可以在相同的数据步骤中加载哈希值。使用call sortc
将按字母顺序对变量排序,这样您就有了一个单一的货币对。然后,您可以测试它的存在并在需要时添加它,而无需进行两次测试。
我还倾向于使用两个密钥(两种货币)来存储它,而不是使用单个合并的密钥,但是在您的应用程序中可能有不这样做的原因。根据我的经验,在这样的应用程序中,有两个键更容易使用。
如果我正确理解了你的问题,也许你可以试试这个:
data want;
if _n_=1 then do;
declare hash h();
h.definekey('CurrencyPair');
h.definedata('CurrencyPair');
h.definedone();
end;
set have;
_CurrencyPair=prxchange('s/(.*)/(.*)/$2/$1/',-1,strip(CurrencyPair));
rc1=h.check();
rc2=h.check(key:_CurrencyPair);
if rc1^=0 and rc2^=0 then do;
h.add();
CurrencyPairRecode = CurrencyPair;
end;
else if rc1^=0 and rc2=0 then do;
h.add();
CurrencyPairRecode =_CurrencyPair;
end;
else if rc1=0 then CurrencyPairRecode = CurrencyPair;
drop rc: _:;
run;