Comment puis-je analyser une adresse dans ses composants individuels?

c# html-agility-pack parsing regex

Question

J'ai été chargé de créer un analyseur syntaxique qui analysera une page Web particulière, afin que nos employés puissent importer en bloc leurs données utilisateur sur leur site Web avec notre société.

J'ai utilisé HtmlAgilityPack pour analyser la page, j'ai corrélé la table row et table data pour qu'elles soient insérées dans les propriétés de ma classe Map .

Cependant, une colonne me cause beaucoup de chagrin. La colonne Adresse est l’épine de mon côté pour diverses raisons.

Exemple de données:

6313 SW 203rd Ave <br> Portland, OR 97224
16600 Lomita Way <br> El Dorado Hills, CA 95762
PO Box #42 <br> Hampton Bays, NY 11946

Chacune de ces adresses est entourée comme suit (évidemment, les adresses peuvent varier en fonction du client pour lequel nous importons des utilisateurs):

<tr>
     <td> 6313 SW 203rd Ave <br> Portland, OR 97224 </td>
</tr>

J'essaie d'implémenter une expression régulière pour la scinder dans la zone appropriée, afin qu'elle puisse être affectée aux propriétés de corrélation:

public string Unit { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }

Cependant, les adresses ne fournissent pas beaucoup de points d'ancrage:

Première question: Si j'ancre au large de la <br> alors je ne sépare les lignes. Ne se divise pas complètement en segments appropriés.

Numéro deux: Même problème avec la virgule individuelle.

Problème 3: Si j'attache aux valeurs numériques, le code postal peut être invalide pour le Canada et se diviser de manière incorrecte en fonction du nom de la rue.

Quel est le meilleur moyen de séparer les éléments d'une adresse? Avec Regex?

Réponse acceptée

Ok, donc le champ Address était assez pénible à analyser. Cependant, j'ai réussi à analyser les données en fonction de mes besoins particuliers.

  • L' Address toujours un <br> entre la rue et la ville.

Alors j'ai fait ce qui suit:

var splitBasedOnHTML = Regex.Split(column[2], @"\br<br>");

La column[] contient mon adresse dans l' index two . Ainsi, après cet appel, mon unité et ma rue seront automatiquement positionnées dans Index Zero . La ville, l’État et Zip seront localisés dans l’ Index One .

J'ai donc fait une autre scission pour casser la ville, l'état et le zip comme ceci:

var splitBasedOnSpace = splitBasedOnHtml[1].Split(' ');

Après cela, je me retrouve maintenant avec ce qui suit:

6313 SW 203rd Ave // splitBasedOnHtml[0]
Portland, // splitBasedonSpace[0]
OR // splitBasedOnSpace[1]
97224 // splitBasedOnSpace[2]

J'ai donc simplement mappé mes propriétés sur ces index de tableaux individuels.

Cette solution suppose que l’Unité est une partie de la rue , ce qui devient un sacrifice acceptable lorsque les données sont importées sur un autre site Web et peuvent être modifiées ultérieurement par certaines personnes.

C’est ainsi que j’ai résolu les problèmes d’analyse. Cette solution n’est peut-être pas viable pour les autres passagers de ce bateau, mais nous espérons qu’il s’agit là d’une solution de rechange intéressante ou d’une bonne direction. A quoi ressemble la méthode:

    public static Map AddressMapper(IList<string> column)
    {
        var map = new Map();
        var splitBasedOnHTML = Regex.Split(column[2], @"\b<br>");
        var splitBasedOnSpace = splitBasedOnHTML[1].Split(' ');

        map.Street = splitBasedOnHTML[0];
        map.City = splitBasedOnSpace[0].Replace(@",", " ");
        map.State = splitBasedOnSpace[1];
        map.Zip = spliteBasedOnSpace[2];

        return map;
    }

Réponse populaire

L'analyse des adresses est difficile; vraiment dur. Il n’existe pas de format véritablement uniforme pour les adresses, en particulier au-delà des frontières. Il est très peu probable que vous puissiez le faire en utilisant un seul RegEx.

Voir cet autre article pour quelques exemples et une explication plus détaillée. Comment analyser une adresse postale / postale libre avec du texte et des composants



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow