¿Cómo puedo analizar una dirección en sus componentes individuales?

c# html-agility-pack parsing regex

Pregunta

Se me ha asignado la tarea de crear un analizador que analice una página web en particular, para que nuestros empleados puedan realizar una importación masiva de sus datos de usuario en su sitio web con nuestra empresa.

He utilizado el HtmlAgilityPack para analizar la página, he correlacionado la table row la table row y table data que se insertarán en las propiedades de mi clase de Map .

Sin embargo, una columna me está causando mucho dolor. La columna Dirección , es la espina en mi costado por una variedad de razones.

Data de muestra:

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

Cada una de esas direcciones se envuelve así (obviamente, las direcciones pueden variar según el cliente para el que estemos importando usuarios):

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

Estoy tratando de implementar una expresión regular para dividir esto en el área adecuada, por lo que puede asignarse a las propiedades correlacionadas:

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; }

Sin embargo, las direcciones no proporcionan mucho para anclar fuera de:

Problema uno: si anclaré el <br> , solo separaré las líneas. No se divide completamente en segmentos apropiados.

Segundo problema: el mismo problema con la coma individual.

Tercer problema: si me anclo a valores numéricos, el código postal puede no ser válido para Canadá y puede dividirse incorrectamente según el nombre de la calle.

¿Cuál es la mejor manera de separar los elementos de una dirección? Con Regex?

Respuesta aceptada

Bien, entonces el campo de Address fue bastante doloroso de analizar. Sin embargo, logré analizar los datos en función de mis requisitos particulares.

  • La Address tiene siempre un <br> entre la calle y la ciudad.

Así que hice lo siguiente:

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

La column[] contiene mi dirección en el index two . Así que después de esa llamada, posicionará automáticamente mi Unidad y Calle en el Index Zero . La ciudad, el estado y el código postal se ubicarán en el Index One .

Así que hice otra división, para romper la Ciudad, el Estado y el Código Postal de la siguiente manera:

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

Después de eso ahora termino con lo siguiente:

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

Así que simplemente asigné mis propiedades a esos índices de matriz individuales.

Esta solución supone que la Unidad está fuera de la Calle , lo que se convierte en un buen sacrificio, ya que los datos se importan a otro sitio web y pueden ser modificados por personas en particular más adelante.

Así es como resolví los problemas de análisis, esta solución puede no ser viable para otros en este barco, pero espero que esta sea una buena alternativa o apunte en una buena dirección. Cómo se ve el método:

    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;
    }

Respuesta popular

Analizar direcciones es difícil; realmente difícil. No existe un formato verdaderamente uniforme para las direcciones, especialmente a través de las fronteras de los países. Es muy poco probable que pueda hacer esto usando un solo RegEx.

Vea esta otra publicación para ver algunos ejemplos y una explicación más detallada. Cómo analizar la calle de forma libre / dirección postal fuera del texto y en los componentes



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow