2009-02-05 5 views
24

Je suis à la recherche d'un bon outil qui peut prendre une adresse postale complète, formaté pour l'affichage ou l'utilisation avec une étiquette de publipostage, et le convertir en un objet structuré.Où est un bon analyseur d'adresse

Ainsi, par exemple:

// Start with a formatted address in a single string 
string f = "18698 E. Main Street\r\nBig Town, AZ, 86011"; 

// Parse into address 
Address addr = new Address(f); 

addr.Street; // 18698 E. Main Street 
addr.Locality; // Big Town 
addr.Region; // AZ 
addr.PostalCode; // 86011 

Maintenant, je pouvais le faire en utilisant RegEx. Mais la partie délicate est de la garder assez générale pour gérer n'importe quelle adresse dans le monde!

Je suis sûr qu'il doit y avoir quelque chose là-bas qui peut le faire.

Si quelqu'un l'a remarqué, il s'agit en fait du format de l'objet opensocial.address.

+1

Ceci est un problème difficile lorsque vous ajoutez des adresses internationales dans le mix. Je sais que [les adresses japonaises] (http://www.japan-guide.com/e/e2224.html) ne suivent pas le modèle street1/street2/city/state/zip que vous avez présenté. Ils descendent dans la rue, bloquent et construisent différemment des adresses américaines habituelles. Les autres adresses en Europe sont également différentes. Cette regex ferait mieux d'être Unicode, car notre alphabet ne sera pas suffisant. Pas un problème facile, IMO. – duffymo

+0

Dupe de ceci: http://stackoverflow.com/questions/16413/parse-usable-street-address-city-state-zip-from-a-string Je suppose que vous voulez dire des adresses américaines. – danieltalsky

Répondre

3

Comme il n'y a pas de solution triviale comme l'a dit @duffymo, la meilleure chose à faire est peut-être de reconsidérer la conception. S'il s'agit d'un formulaire utilisateur, faites un compromis et laissez l'utilisateur le remplir. Si vous analysez rétroactivement des données, utilisez une expression régulière très stricte pour analyser les adresses en fonction de certains critères (le pays est US). Ensuite, faites une deuxième passe à ceux qui restent et ainsi de suite. J'ai adopté cette approche et c'est la seule approche fiable.

Un autre problème de conception avec une approche générique regex est qu'il générera un faux positif pour les mauvaises adresses. Si vous envoyez des courriels à ces gens, ils finiront par bondir et vous aurez plus de travail à faire pour essayer de déterminer ceux qui reviennent ou continuer à envoyer des courriels à des adresses erronées.

24

L'API Googlemaps fonctionne plutôt bien pour cela. Par exemple, supposons qu'on vous donne la chaîne "120 w 45 st nyc". Passez dans l'API Googlemaps comme ceci: http://maps.google.com/maps/geo?q=120+w+45+st+nyc et vous obtenez cette réponse:

{ 
    "name": "120 w 45 st nyc", 
    "Status": { 
    "code": 200, 
    "request": "geocode" 
    }, 
    "Placemark": [ { 
    "id": "p1", 
    "address": "120 W 45th St, New York, NY 10036, USA", 
    "AddressDetails": {"Country": {"CountryNameCode": "US","CountryName": "USA","AdministrativeArea": {"AdministrativeAreaName": "NY","Locality": {"LocalityName": "New York","Thoroughfare":{"ThoroughfareName": "120 W 45th St"},"PostalCode": {"PostalCodeNumber": "10036"}}}},"Accuracy": 8}, 
    "ExtendedData": { 
     "LatLonBox": { 
     "north": 40.7603883, 
     "south": 40.7540931, 
     "east": -73.9807141, 
     "west": -73.9870093 
     } 
    }, 
    "Point": { 
     "coordinates": [ -73.9838617, 40.7572407, 0 ] 
    } 
    } ] 
} 
+9

Je suppose que je voudrais savoir comment Google le fait. –

+0

soyez juste averti que vous pouvez obtenir plus d'un résultat en retour. Si vous le faites à des fins de «normalisation», vous devrez échouer le résultat. assez étonné à quel point cela fonctionne si –

+3

A une limite d'environ 15 000 demandes par jour. Soyez donc respectueux et prudent et vérifiez les conditions d'utilisation http://econym.org.uk/gmap/geomulti.htm –

0

Pour les adresses canadiennes, j'ai utilisé un appelé Street Perfect. Nous avons dû envelopper le code c++ dans certains .net pour le rendre réutilisable pour notre usage, mais c'était assez facile.

3

Comme cela a été mentionné, ce n'est pas un problème trivial. L'un des plus gros problèmes - hormis les adresses internationales - est qu'il n'y a pas de format standard pour les adresses et qu'une adresse ne peut pas vous dire si elle est bien formée, c'est-à-dire qu'elle ne s'auto-valide pas comme un numéro de carte de crédit . Pour cette raison, vous devez vous fier à une source de vérité externe pour vous assurer que l'adresse est réelle. C'est là qu'un service de vérification d'adresse entre en jeu. Selon les besoins de votre entreprise et les exigences de votre application, il se peut que vous envisagiez un nettoyage ponctuel par lots de votre liste d'adresses, ou peut-être un service de validation d'adresse en temps réel ou en temps réel. Il existe un certain nombre de bons fournisseurs (dont les coûts varient) qui peuvent facilement résoudre ce problème.

Je devrais mentionner que je suis le fondateur de SmartyStreets. Nous faisons CASS-certified address verification. Nous prendrons vos adresses non formatées/brutes et les transformerons en adresses qui ont été nettoyées, standardisées et vérifiées/confirmées. Selon la taille de votre liste, le coût est généralement de quelques dollars et le délai d'exécution est presque instantané - généralement quelques minutes.

6

Si vous êtes à la recherche d'un analyseur d'adresse avec une solution simple, essayez ceci:

http://usaddress.codeplex.com/

Bon: 1. Aucune base de données requise 2. Aucune recherche Internet requise 3.

assez précis

Bad: 1. ne peut pas confirmer si elle est une adresse réelle 2. ne fonctionne que pour nous adresser 3. en C#, utilisez .NET 3.5 ou au-dessus

+0

avertissement rapide - ressemble exactement à vouloir je voulais ... sauf pour la partie GPL. Nous ne distribuons pas notre code, encore. – viggity

Questions connexes