<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />最近,一位客户问我如何获得具有经度和纬度值的9位邮政编码列表,可以将其导入JMP以与包含9位邮政编码的现有JMP数据表合并。这个问题对我来说是新问题,我从其他人那里建议,也许SAS PROC GEOCODE会有所帮助。但是,我知道客户不是SAS程序员,所以我希望找到一条幸福的道路,其中不包括需要学习如何在SAS中编程。
我首先签出了JMP Geocoder加载项,但似乎只有Geocode达到了5位zip级别。客户已经拥有了X / Y纬度/经度位置,但是需要一些更细粒度的内容,因此需要9位zip。我接下来对PROC GEOCODE进行了调查,结果发现proc需要两个表-您的数据表和一个表,该表具有链接到纬度和经度值的9位邮政编码。但是我已经有了所需的邮政编码-如果我可以找到索引表,则似乎不需要proc来联接表,尽管它确实提供了一些模糊匹配,而直接联接则没有。
我检查了SAS技术支持后,他们说,他们拥有的数据表(包括9位zip文件)可以在的链接上找到这一页下了 Zip + 4地理编码部分。ÿ 您确实需要一个SAS配置文件ID才能下载zip文件,如果您正在阅读zip文件,并且已经成为JMP社区的成员,则该文件已经存在。无论如何,都可以免费设置SAS配置文件。该文件是从2006年开始,所以已经过时了,但是显然,TIGER数据的当前版本不包含zip + 4数据。页面的下一部分提到了付费来源(Melissa数据),该来源提供了更多最新信息并需要付费以保持更新。
下载zip文件后,您可以看到它包含一个自述文件,一个CSV文件(ZIP4.CSV)和一个SAS程序。我以为那时可以将CSV直接导入到JMP中,但这就是我遇到的问题#1:CSV文件缺少列标题!我回到SAS程序并使用它导入了数据,并添加了列标题,以便可以看到它们是什么。但是,添加列名的程序也似乎对列进行了重新排序,因此确定CSV中的哪些列与SAS表中的命名列相匹配成为了一个匹配游戏。
现在,我回到JMP来导入包含列标题的导入SAS文件,这是遇到#2问题的地方。5位邮政编码中的某些以“ 00”或“ 0”开头,并且从CSV导入到JMP中时,该列被视为数字数据,因此导入时会从邮政编码中删除前导0。我检查了“列属性”,并在列上设置了Z5 SAS格式,但是我与Xan进行了交谈,他确认JMP当前不了解该邮政编码格式。
我可以通过将条件列更改为character并根据每个zip的长度添加0、1或2个零来解决此问题后,使用条件公式列进行修复,但他建议最快的解决方案可能是重新导入CSV文件使用JMP的“文本导入预览”模式,这将使我既可以将列类型更改为字符,也可以重命名导入之前需要的列。我打开了SAS文件,并仅确定了我需要的列的列标题名称,然后这样做。
要自己导入ZIP4.CSV文件,您需要单击一下文件>新脚本在JMP中,然后将下面的文本粘贴到脚本窗口中。将光标放在第一行的开头,然后单击工具栏上的“运行脚本”按钮。 您可以将鼠标悬停以找到带有工具提示的按钮,或者右键单击脚本窗口并选择“运行脚本”。如下所述,您需要指向计算机上从以上链接到SAS支持网站下载并解压缩的文件的正确路径。
名称默认为此处 ( 1个 ) ;
//将下面的路径替换为保存在计算机上的CSV文件的路径
压缩数据 = 打开 (
“ C:\ <您的文件夹位置> \ ZIP4.csv” ,
列(
柱 ( “压缩” ,字符 , “名义” ) ,
柱 ( “邮政编码+4” ,字符 , “名义” ) ,
柱 ( “ c000003” ,字符 , “名义” ) ,
柱 ( “市” ,字符 , “名义” ) ,
柱 ( “ c000005” ,字符 , “名义” ) ,
柱 ( “ c000006” ,字符 , “名义” ) ,
柱 ( “ c000007” ,字符 , “名义” ) ,
柱 ( “ c000008” ,数字 , “连续” ,格式 ( “最好” , 10 )) ,
柱 ( “ c000009” ,数字 , “连续” ,格式 ( “最好” , 10 )) ,
柱 ( “ c0000010” ,数字 , “连续” ,格式 ( “最好” , 10 )) ,
柱 ( “X” ,数字 , “连续” ,格式 ( “最好” , 10 )) ,
柱 ( “ Y” ,数字 , “连续” ,格式 ( “最好” , 10 )) ,
柱 ( “ c0000013” ,字符 , “名义” ) ,
柱 ( “ c0000014” ,字符 , “名义” )
) ,
导入设置(
行尾(CRLF , CR ,如果 ) ,
场结束(逗号 , CSV( 0 )) ,
带状引号( 1个 ) ,
使用撇号作为引号( 0 ) ,
扫描整个文件 1个 ) ,
将空列视为数字( 0 ) ,
CompressNumericColumns( 0 ) ,
CompressCharacterColumns( 0 ) ,
CompressAllowListCheck( 0 ) ,
标签( 0 ) ,
列名开始( 1个 ) ,
数据开始 1个 ) ,
读行 “所有” ) ,
年规则( “ 20xx” )
)
) ;
//您可以选择和删除表中未命名的列-它们是与人口普查有关的详细信息,我认为您确实不需要。 如果您发现自己愿意,请告诉我。
如上所述,我没有进行匹配练习来获得此文件中所有列的所有正确列名,因为我不需要与普查相关的属性,只需要邮政编码,城市和X / Y对应于纬度和经度的坐标。如果您有权访问SAS,则可以运行脚本以将文件导入SAS以查看所有列名称,并调整此脚本以正确命名所有通用c000003,c000004等列,或者是否需要这些名称而不必使用SAS,请在此处添加评论,我将返回以完成该工作。
运行脚本生成表并将其保存后,可以将X和Y拖动到图形生成器中的放置区域以查看邮政编码的位置。 他们是如此密集,以致于在很大程度上展现了这个国家的形态!

导入的表约为1660万行和14列。当我的决赛桌缩小到我需要的5列时,我的决赛桌仍然是半场。
接下来,您将需要将此表与包含9位zip的现有JMP表联接。一个重要因素是确定您的邮政编码格式是否与导入表的格式匹配,该表在单独的列中具有5位邮政编码和4位扩展名。如果您的数据表也是如此,那么您应该做得很好表格>联接 ,选择按匹配列将两个表连接起来,然后选择合适的列以匹配两个列。
但是,如果您需要XXXXX-XXXX格式的列,因为这是数据表中包含邮政编码的格式,则可以对刚导入的表执行以下操作。
- 右键单击表格右侧的空白列,然后选择新专栏…
- 在弹出的对话框中,将新列命名为ZIP CODE,然后在列属性下拉菜单,选择式 。这将打开JMP的公式编辑器。
- 在“表格列”下拉列表下的列选择器中单击ZIP,然后选择字符在“功能”部分下的列选择框中,然后选择康卡特从弹出列表中。 在打开的空白框中输入“-”。
- 请点击角色> Concat 再次选择新的空白框,然后从表格列选择框中选择Zip + 4列。
- 您应该看到这样的公式:

公式类似于上面的公式后,在公式编辑器中单击“确定”,然后在列对话框中再次单击“确定”。 这应该在表中添加一个名为ZIP CODE的新列,其中包含格式为00601-2103的zip。然后,您可以与包含该格式的zip的原始数据表连接。
CSV文件的前两行在导入时似乎有些混乱,但是我不确定为什么会这样,除非原始CSV文件中存在问题。它们很容易修复。
我希望此信息对需要9位邮政编码数据的其他人可能有所帮助。 同样,它不是此数据的最新版本,但对于某些应用程序可能已足够。如果您需要更好的地址或邮政编码数据的模糊匹配,并且可以访问SAS,则也可以签出PROC GEOCODE。
PS,我敢肯定,有更好的方法可以通过脚本编写和SAS集成来做到这一点,但是当帮助不是脚本编写者并且无法访问SAS的客户时,我不得不找到一种仅JMP且很大程度上是交互式的途径。
杰夫·帕金森