作为输入,我得到一个字符串的地址。它可能会说"123 Fake Street\nLos Angeles, CA 99988"
之类的东西。如何将其转换为具有以下字段的对象:
Address1
Address2
City
State
Zip Code
或类似的东西?如果有一个可以做到这一点的java库,那就更好了。
不幸的是,我没有选择String作为输入。它是我试图实施的规范的一部分。
输入结构不是很好,因此代码需要具有很强的容错能力。此外,地址可能来自世界各地,但100个中的99个可能在美国。
答案 0 :(得分:3)
您可以使用JGeocoder
public static void main(String[] args) {
Map<AddressComponent, String> parsedAddr = AddressParser.parseAddress("Google Inc, 1600 Amphitheatre Parkway, Mountain View, CA 94043");
System.out.println(parsedAddr);
Map<AddressComponent, String> normalizedAddr = AddressStandardizer.normalizeParsedAddress(parsedAddr);
System.out.println(normalizedAddr);
}
输出将是:
{street=Amphitheatre, city=Mountain View, number=1600, zip=94043, state=CA, name=Google Inc, type=Parkway}
{street=AMPHITHEATRE, city=MOUNTAIN VIEW, number=1600, zip=94043, state=CA, name=GOOGLE INC, type=PKWY}
您可以查看其试用版的另一个库International Address Parser。它也支持国家。
AddressParser addressParser = AddressParser.getInstance();
AddressStandardizer standardizer = AddressStandardizer.getInstance();//if enabled
AddressFormater formater = AddressFormater.getInstance();
String rawAddress = "101 Avenue des Champs-Elysées 75008 Paris";
//you can try to detect the country
CountryDetector detector = CountryDetector.getInstance();
String countryCode = detector.getCountryCode("7580 Commerce Center Dr ALABAMA");
System.out.println("detected country=" + countryCode);
另外,请检查此库中的Implemented Countries。
干杯!!
答案 1 :(得分:2)
我在SmartyStreets工作,我们开发地址解析和提取算法。
这很难。
如果您的大多数地址都在美国,您可以使用地址验证服务来提供有保证的准确解析结果(因为地址会根据主列表进行检查)。
有几个提供商,所以看看周围找一个适合你的提供商。由于您可能无法在本地安装数据库(不是没有大笔费用,因为地址数据由USPS许可),请查找提供REST端点的数据库,以便您可以发出HTTP请求。由于您听起来有很多地址,因此请确保API具有高性能,并允许您进行批量请求。
例如,我们的:
<强>输入:强>
13001 Point Richmond Dr NW,Gig Harbor WA
<强>输出:强>
或者更具体的组件细分,如果需要:
如果输入更加混乱,可以使用一些地址提取服务来处理地址中的一点噪声,并解析文本中的地址并将其转换为组件。 (SmartyStreets也提供此功能,作为测试版API。我相信其他一些NLP服务也会做类似的事情。)
当然,这仅适用于美国地址。我不是英国或加拿大地址的专家,但我相信它们可能会稍微简单一些。
(除了少数几个发达国家之外,国际数据真的很难实现。可靠的数据集很难获得或不存在。但如果你真的在上> em>预算紧张,您可以为all the address formats编写自己的解析器。)
答案 2 :(得分:1)
如果您确定格式,可以使用正则表达式从字符串中获取地址。对于示例,您提供了类似这样的内容:
String address = "123 Fake Street\\nLos Angeles, CA 99988";
String[] parts = address.split("(.*)\\n(.*), ([A-Z]{2}) ([0-9]{5})");
答案 3 :(得分:0)
我假设信息序列始终相同,因为用户永远不会在State之前输入邮政编码。如果我正确地得到你的问题,你需要逻辑来处理可能不完整的地址(比如错过一部分)。 一种方法是查找你知道正确的字符串部分。您可以将Address的已知部分视为分隔符。您将需要城市和州名称和地址单词(例如&#34; Street&#34;,&#34; Avenue&#34;,&#34; Road&#34;等)。
如果地址缺失州和城市,您实际上也需要一个邮政编码列表,因此最好确保用户至少输入其中一个。
实现你需要的东西并非不可能,但你可能不想浪费所有的时间去做。确保用户正确输入所有内容更容易。
答案 4 :(得分:-4)
也许你可以使用Regular Expression