我正在尝试创建一个以增量方式构建的哈希变量。我想解决的具体问题是我有一列货币对:
|--------------------|
| 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:CurrencyPair) IF(rc = 0)那么 CurrencyPairRecode = CurrencyPair
如果没有,请检查翻转的货币对是否在哈希表中。如果是,则CurrencyPairRecode
是翻转值
CALL CATX(“/”,FLIPPED,SUBSTR(SETTLEMENT_EXCHANGE_RATE_BASIS,4,3),SUBSTR(SETTLEMENT_EXCHANGE_RATE_BASIS,1,3));
flip_rc = h.Check(key:FLIPPED); IF(flip_rc = 0)那么 CurrencyPairRecode =翻转;
如果两者都不是,则CurrencyPairRecode
与CurrencyPair
相同,并将CurrencyPair
添加到哈希表中。
IF(rc ^ = 0 AND flip_rc ^ = 0)那么 h.ADD(关键:CurrencyPair,数据:1); CurrencyPairRecode = CurrencyPair
我已经尝试过此代码,但我遇到了错误。我是SAS的新手,所以不确定如何排除故障。感谢所有帮助。
答案 0 :(得分:3)
我使用的一般方法是以始终排序的顺序存储货币对。当订单真的不相关时(因为您不必跟踪它),这尤其有吸引力。
我会做这样的事情。
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;
然后,您可以在同一个datastep中加载哈希值。使用call sortc
将按字母顺序对变量进行排序,以便您拥有单一货币对。然后,您可以测试其存在并在需要时添加它,而无需进行两次测试。
我还表示一般倾向于使用两个密钥(两种货币)而不是使用单个合并密钥来存储它,但可能有理由不在您的应用程序中执行此操作。根据我的经验,在这样的应用程序中,两个键往往更容易使用。
答案 1 :(得分:0)
如果我理解你的问题,也许你可以试试这个:
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;