我正在尝试清理位于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条件。这只是一个样本。
答案 0 :(得分:0)
在DATA步骤中执行此操作应该没问题。它缓慢的原因是你为每次观察处理地址线的每个字符数百次。 (我认为如果正则表达式是常数,SAS会预先准备正则表达式,但如果不是,则使用PRXPARSE
可能会有所帮助。)
如果您的所有正则表达式都是(单词)形式 - > (标准化的单词),那么你可以一个字一个字地完成它并完全跳过正则表达式处理:
答案 1 :(得分:0)
你可以尝试其他几件事。
答案 2 :(得分:0)
将原始数据拉入SAS(不运行任何正则表达式)需要多长时间?
如果以上内容很快,那么问题可能是从SAS代码到正在发生的mySQL代码的转换。我不认为在200万次观察中运行大量的正则表达式会花费很多时间,因为我之前已经经历了类似的过程,而且还有更多的数据。
你可以把它分成两步。