如何创建一个宏变量,该宏变量使用另一个数据集的数据替换为/?

时间:2019-05-15 15:56:24

标签: sas

我正在寻找一种使用数据集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

有人知道我该怎么解决吗?

2 个答案:

答案 0 :(得分:0)

该问题最简单的解决方案-有很多可能的解决方案-使用from / to数据集作为转换表。

顺便说一下,这不是一个小问题。当您进行许多可能的更改时,这是一件非常困难的事情。您还将得到一些误报,在其中您应该更改不应更改的内容,除非您具有定义明确的文本(几乎可以肯定没有)。

但是最终您可以尝试执行以下操作:

doc = Nokogiri::HTML(html)
doc.xpath('//div[@class="paginate_box"]/a[not(@class="next_page")]').last.text
#=> "3"

这不是完全正确,但这是您要执行的操作的框架。它也不是快速;您可能希望更快地执行某项操作,如果要这样做,则需要对该算法的替代方法进行一些研究。

答案 1 :(得分:0)

您选择的技术部分取决于所处理地址的数量和可能的替换数量。

考虑遍历原始文字,而不是遍历潜在的替换内容。

本质上:

  • 针对地址中的每个单词
  • 要替换的查询字
  • 将单词/替换单词组合回转换后的地址

每个过程都有几种可能性

  • 扫描
  • prxmatch / prxnext

查找过程有很多可能性

  • 哈希查找
  • 自定义格式
  • 合并
  • 左加入

合并过程有多种可能性

  • ||串联运算符
  • catx函数

一种实现的示例:

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;