我正在使用AccessDB应用程序中的新功能从医院名称返回Lat / Lon信息。以下功能提供了我提供名称和功能时所需的功能。地址。我注意到(意外)该函数返回一个格式化的地址,即使我提供了一个有效的医院名称。我想我可以利用它将地址信息回填到我的数据库中。
似乎std::array
是"主要是"一致且易于解析使用","获取地址/城市/州/邮政信息;作为分隔符。我的复杂情况是一个罕见的场合,其中一个"楼层编号"包含在格式化的地址字符串中。我的解析例程失败了。
我找到了这个例程(不是我的):
Geocode.sRetAddress = .selectSingleNode("//formatted_address").Text
示例结果(Geocode.sRetAddress - 格式化地址):
good:100 S Raymond Ave,Alhambra,CA 91801,USA
good:3040 Salt Creek Ln,Arlington Heights,IL 60005,USA
坏:4楼,2450 Ashby Ave,Berkeley,CA 94705,USA
问题
任何线索,如果" Floor"可以排除格式化地址的组件,或者显式返回所需的组件?
谢谢,
Mark Pelletier
PS>我目前正在计算","在字符串中并有条件地处理解析任务。但作为一种通用方法,可能还有其他我尚未遇到的例外。
答案 0 :(得分:0)
我是XPath
的初学者,但我想我可以解决这个问题:
而不是:
'formatted_address
Geocode.sRetAddress = .selectSingleNode("//formatted_address").Text
使用:
'Build an address:
Geocode.sRetAddress = oXMLDoc.selectSingleNode("descendant::address_component[type='street_number']/short_name").text
Geocode.sRetAddress = Geocode.sRetAddress & " " oXMLDoc.selectSingleNode("descendant::address_component[type='route']/short_name").text
Geocode.sRetAddress = Geocode.sRetAddress & ", " oXMLDoc.selectSingleNode("descendant::address_component[type='locality']/short_name").text
Geocode.sRetAddress = Geocode.sRetAddress & ", " oXMLDoc.selectSingleNode("descendant::address_component[type='administrative_area_level_1']/short_name").text
Geocode.sRetAddress = Geocode.sRetAddress & " " oXMLDoc.selectSingleNode("descendant::address_component[type='postal_code']/short_name").text
Geocode.sRetAddress = Geocode.sRetAddress & ", " oXMLDoc.selectSingleNode("descendant::address_component[type='country']/short_name").text
根据Google Maps地理编码API提供的组件手动构建地址。
请注意,如果您正在解析诸如城市和州之类的内容,那么这是一件相当愚蠢的事情,因为它们只能在XML文档中使用。你最好直接从XML中读取它们。
答案 1 :(得分:0)
重新阅读,看起来您的具体情况仅适用于医院,因此您无需考虑此处列出的所有问题。不过,我会留下这个,以防其他人想要解析包含不仅仅是“楼层”的地址。而且 - 你可以考虑找到“根”的算法。
我参与了一个类似的项目,我需要识别“根”物理地址,这可能比看到它更复杂。有许多陷阱需要注意。我最终不得不构建一个完整的规则引擎。预测每种可能的组合并考虑它。
-2 Main St 4楼 -2 Main St 3楼 -2主St单元3 4楼2 Main St -Apt 3 2主要街道 -Apt 3 22 Rte 7 -2主楼1楼 ......还有更多
作为一般规则,您通常会尝试识别格式为“2 Main Street”的地址部分,其中您有一个数字,街道名称以及描述街道/道路/车道等的后缀。这是一般算法,只是基础。你需要扩展。
如果有逗号,请将字符串拆分为单独的元素以进行单独评估
删除地址元素中的所有标点符号
查找“街道”的索引你必须有一个相当广泛的列表,但这里有一些:
道路,路,街,St,大道,大道,Blv,方式,大道,大道,杀,驱动器,博士,车道,Ln,路径,公路,Hwy,BiWay,Bwy,高速公路。 Circle,Cir,Crossing,Xing,Route,Rte,Rural Route,RR 我相信你能想到更多。找到其中一个的最右侧实例并从该索引向后工作,直到找到一个数值(或者更准确地说,是一组连续数值的开头的索引)。 - 确保数字值不是街道名称的一部分(即“第3街”),这意味着确保数字值后面没有“rd”或“th”或“nd”,或确保它有空格如果是,请继续回顾,直到找到街道地址的数字部分。 - 找到数值后,您可能会得到所需的数值。抓住数值和“街道”之间的所有内容。
其他需要注意的事项: - “Street”和“Saint”的缩写是相同的。如“2 St Francis St” - “Doctor”和“Drive”的缩写是相同的。 “3 Dr. Jones博士” - “路线”和“高速公路”可以跟随它们的数值,如“2路5” - “Street / Drive”的许多化身的缩写经常埋在街道名称中。 “3 Caveman Arrival St”包含“ave”和“rr”和“st” - 数字部分也可以写成“三大街”中的单词,
如果您选择尝试识别不需要的地址部分而不是所需的部分,那么您同样需要考虑过多的潜在情况:
公寓,公寓,套房,Ste,楼层,Fl,单位,#,平,框,POBox,PO,建筑,大厦,Bld,宿舍,房间,Rm
最终,您可能会遇到许多您需要考虑的情景/例外以及许多“案例”。您还可以考虑使用正则表达式来识别它们。祝你好运!