清理SAS中地址的最佳方法

时间:2012-07-19 16:11:49

标签: sas

我正在尝试清理位于DB2数据库中的大约2千万个地址(使用ODBC,SAS EG 4.3进行连接)。下面是一些示例代码。此代码运行时间很长。有没有办法优化它?这可能是在sql步骤而不是在数据步骤中尝试(我不知道这是否会更快)?

%macro addy(orig_addy,edited_addy);
*scrub original address field;
addr=upcase(&orig_addy.);

addr=(left(tranwrd(cat(' ',addr,' '),' SO. ',' S ')));

addr=compress(addr,".,()'");
addr=translate(addr, ' ', '_/-#;');

&edited_addy.=left(prxchange('s/ NORTH / N /',-1,cat(' ',addr,' ')));
&edited_addy.=left(prxchange('s/ SOUTH / S /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ EAST / E /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ WEST / W /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ NORTHWEST / NW /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SOUTHWEST / SW /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ NORTHEAST / NE /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SOUTHEAST / SE /',-1,cat(' ',upcase(&edited_addy.),' ')));

&edited_addy.=left(prxchange('s/ SAINT / ST /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/   / /',-1,cat(' ',upcase(&edited_addy.),' '))); *tripple spaces;
&edited_addy.=left(prxchange('s/  / /',-1,cat(' ',upcase(&edited_addy.),' '))); *double spaces;
&edited_addy.=left(prxchange('s/ & / AND /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ @ / AT /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ INTERNATIONAL / INTL /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SUITE / STE /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ SUITES / STES /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ FLOOR | FLR / FL /',-1,cat(' ',upcase(&edited_addy.),' ')));
&edited_addy.=left(prxchange('s/ BUILDING / BLDG /',-1,cat(' ',upcase(&edited_addy.),' ')));
...
...
...

现在,这只运行了20个小时,只有2百万次观察。有比这里看到的更多的prxchange条件。这只是一个样本。

3 个答案:

答案 0 :(得分:0)

在DATA步骤中执行此操作应该没问题。它缓慢的原因是你为每次观察处理地址线的每个字符数百次。 (我认为如果正则表达式是常数,SAS会预先准备正则表达式,但如果不是,则使用PRXPARSE可能会有所帮助。)

如果您的所有正则表达式都是(单词)形式 - > (标准化的单词),那么你可以一个字一个字地完成它并完全跳过正则表达式处理:

  • 创建一个包含所有规范化的hash object(或character format,如果您是旧学校)
  • 将地址行拆分为单词
  • 使用哈希对象标准化每个单词
  • 重新加入地址

答案 1 :(得分:0)

你可以尝试其他几件事。

  • 使用/ o结束正则表达式告诉SAS只编译一次字符串,因此不应为每次观察处理它。
  • 如果您确定某些/所有搜索只有1次匹配,那么将-1更改为1应该可以加快速度。

答案 2 :(得分:0)

将原始数据拉入SAS(不运行任何正则表达式)需要多长时间?

如果以上内容很快,那么问题可能是从SAS代码到正在发生的mySQL代码的转换。我不认为在200万次观察中运行大量的正则表达式会花费很多时间,因为我之前已经经历了类似的过程,而且还有更多的数据。

你可以把它分成两步。

  1. 将未修改的数据带入SAS。
  2. 有sas应用清洁程序。