【问题标题】:Best way to clean addresses in SAS在 SAS 中清理地址的最佳方法
【发布时间】:2012-07-19 16:11:49
【问题描述】:

我正在尝试清理位于 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.),' ')));
...
...
...

目前,仅 200 万次观测就运行了 20 小时。 prxchange 条件比这里看到的要多得多。这只是一个示例。

【问题讨论】:

    标签: sas


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您还可以尝试其他一些方法。

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-25
          • 2011-10-15
          • 2014-05-30
          • 2010-10-13
          • 2022-01-27
          • 2016-06-18
          • 1970-01-01
          • 2010-11-25
          • 1970-01-01
          相关资源
          最近更新 更多