2

我正在尝试清理位于 DB2 数据库中的大约 2000 万个地址(使用 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 小时,只进行了 200 万次观测。prxchange 条件比这里看到的要多得多。这只是一个示例。

4

3 回答 3

0

您还可以尝试其他几件事。

  • 以 /o 结尾的正则表达式告诉 SAS 只编译一次字符串,因此它不应该为每次观察处理它。
  • 如果您确定某些/所有搜索只有 1 次匹配,那么将 -1 更改为 1 应该会加快速度。
于 2012-07-20T09:46:34.380 回答
0

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

如果上述操作很快,那么问题可能是正在发生的从 SAS 代码到 mySQL 代码的转换。我认为在 200 万个观察值上运行大量正则表达式根本不会花费太多时间,因为我之前已经经历过类似的过程,并且有更多的数据。

你可以把它分成2个步骤。

  1. 将未修改的数据带入 SAS。
  2. 让 sas 应用清洁程序。
于 2012-07-20T14:47:59.560 回答
0

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

如果您所有的正则表达式都是 (word) -> (normalized word) 形式,那么您可以逐字执行并完全跳过正则表达式处理:

  • 创建一个包含所有规范化的哈希对象(或字符格式,如果你是老派)
  • 将地址行拆分为单词
  • 使用哈希对象规范化每个单词
  • 重新加入地址
于 2012-07-19T16:26:41.083 回答