我正在寻找一种使用数据集2中的内容替换数据集1的字符串的方法。
我在数据集1上具有“地址”字段:
data dataset;
infile datalines;
input Address $ B $;
datalines;
Indonesia St
Canada Av near from USA St
Japan St
Cingapure Av
;
run;
我有一个将用作FROM / TO的数据集:
data dataset;
infile datalines;
input A $ B $;
datalines;
St Street
Av Avenue
;
run;
我希望返回这样的内容:
Indonesia Street
Canada Avenue near from USA Street
Japan Street
Cingapure Avenue
有人知道我该怎么解决吗?
答案 0 :(得分:0)
该问题最简单的解决方案-有很多可能的解决方案-使用from / to数据集作为转换表。
顺便说一下,这不是一个小问题。当您进行许多可能的更改时,这是一件非常困难的事情。您还将得到一些误报,在其中您应该更改不应更改的内容,除非您具有定义明确的文本(几乎可以肯定没有)。
但是最终您可以尝试执行以下操作:
doc = Nokogiri::HTML(html)
doc.xpath('//div[@class="paginate_box"]/a[not(@class="next_page")]').last.text
#=> "3"
这不是完全正确,但这是您要执行的操作的框架。它也不是快速;您可能希望更快地执行某项操作,如果要这样做,则需要对该算法的替代方法进行一些研究。
答案 1 :(得分:0)
您选择的技术部分取决于所处理地址的数量和可能的替换数量。
考虑遍历原始文字,而不是遍历潜在的替换内容。
本质上:
每个过程都有几种可能性
查找过程有很多可能性
合并过程有多种可能性
一种实现的示例:
data addr; input; length address $100;
address = _infile_;
datalines;
Indonesia St
Canada Av near from USA St
Japan St
Cingapure Av
;
run;
data map;
infile datalines;
input source $ destin $;
datalines;
St Street
Av Avenue
;
run;
data want;
if 0 then set map;
if _n_ = 1 then do;
declare hash lookup(dataset: 'map');
lookup.defineKey('source');
lookup.defineData('source', 'destin');
lookup.defineDone();
end;
set addr end=lastrecord;
length altaddr $100;
do index = 1 to countw(address);
word = scan(address,index);
if length(word) <= lengthm(source) then do;
if 0 = lookup.find(key:trim(word))
then altaddr = catx(' ', altaddr, destin);
else altaddr = catx(' ', altaddr, word);
end;
else
altaddr = catx(' ', altaddr, word);
end;
* address = altaddr;
drop source destin index word;
run;