32 Stimmen

Wo ist ein guter Address Parser?

Ich bin auf der Suche nach einem guten Werkzeug, das eine vollständige Postadresse, die für die Anzeige oder die Verwendung mit einem Versandetikett formatiert ist, in ein strukturiertes Objekt umwandeln kann.

So zum Beispiel:

// 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

Jetzt könnte ich dies mit RegEx tun. Aber der schwierige Teil ist, es allgemein genug zu halten, um jede Adresse in der Welt zu behandeln!

Ich bin sicher, dass es etwas gibt, das das kann.

Falls es jemandem aufgefallen ist, ist dies das Format der opensocial.adresse objet.

25voto

Tom Lehman Punkte 79633

Die Googlemaps-API eignet sich hierfür sehr gut. Angenommen, Sie erhalten die Zeichenfolge "120 w 45 st nyc". Geben Sie sie wie folgt an die Googlemaps-API weiter: http://maps.google.com/maps/geo?q=120+w+45+st+nyc und Sie erhalten diese Antwort:

{
  "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 ]
    }
  } ]
}

7voto

liuhongbo Punkte 1893

Wenn Sie einen Adressparser mit einer einfachen Lösung suchen, versuchen Sie dies:

http://usaddress.codeplex.com/

Gut: 1. Keine Datenbank erforderlich 2. Keine Internetrecherche erforderlich 3. Ziemlich genau

Schlecht: 1. Kann nicht bestätigen, ob es eine echte Adresse ist 2. Funktioniert nur für US-Adressen 3. in C#, verwenden Sie .NET 3.5 oder höher

5voto

Jonathan Oliver Punkte 5079

Wie bereits erwähnt, handelt es sich hierbei nicht um ein triviales Problem. Eines der größten Probleme - abgesehen von internationalen Adressen - ist das Fehlen eines Standardformats für Adressen und die Tatsache, dass eine Adresse nicht sagen kann, ob sie wohlgeformt ist, d. h. sie ist nicht selbstüberprüfend wie eine Kreditkartennummer.

Aus diesem Grund müssen Sie sich auf eine externe Quelle der Wahrheit verlassen, um sicherzustellen, dass die Adresse echt ist. Hier kommt ein Adressprüfdienst ins Spiel. Je nach den Bedürfnissen Ihres Unternehmens und den Anforderungen Ihrer Anwendung können Sie eine einmalige "Batch"-Prüfung Ihrer Adressliste oder einen Echtzeit-/Live-Adressprüfungsdienst in Betracht ziehen. Es gibt eine Reihe von guten Anbietern (mit unterschiedlichen Kosten), die dieses Problem leicht lösen können.

Ich sollte erwähnen, dass ich der Gründer von SmartyStreets bin. Wir machen CASS-zertifizierte Adressprüfung . Wir nehmen Ihre unformatierten/rohen Adressen und verwandeln sie in bereinigte, standardisierte und geprüfte/bestätigte Adressen. Je nach Größe Ihrer Liste betragen die Kosten in der Regel nur ein paar Euro und die Bearbeitungszeit ist fast sofort - in der Regel ein paar Minuten.

4voto

Steve B. Punkte 52372

Sie könnten versuchen Experian Adressüberprüfung . Hat es seine Probleme, aber ziemlich viel funktioniert wie beworben.

3voto

aleemb Punkte 29695

Da es keine triviale Lösung gibt, wie @duffymo sagte, wäre es vielleicht am besten, das Design zu überdenken. Wenn es sich um ein Benutzerformular handelt, machen Sie einen Kompromiss und lassen Sie den Benutzer es ausfüllen. Wenn Sie Daten rückwirkend analysieren, dann verwenden Sie eine sehr strenge Regex, um Adressen anhand bestimmter Kriterien (Land ist USA) zu analysieren. Dann machen Sie einen zweiten Durchgang für die übrig gebliebenen Adressen und so weiter. Ich habe diesen Ansatz gewählt, und es ist der einzige zuverlässige Ansatz.

Ein weiteres Designproblem bei der Verwendung eines generischen Regex-Ansatzes besteht darin, dass er falsch-positive Ergebnisse für schlechte Adressen erzeugt. Wenn Sie an diese Personen Post versenden, wird diese zurückgeschickt, und Sie haben mehr Arbeit damit, herauszufinden, welche zurückkamen, oder weiterhin E-Mails an fehlerhafte Adressen zu senden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X