住所行を 2 つのフィールドに分割する最良の方法
-
21-08-2019 - |
質問
をインポートする C# アプリケーションを開発しています。 アドレスデータ CRM システムに組み込まれます。CSV ファイルには、「Somethingstreet 34」のような住所列が含まれています。ただし、当社の CRM では 2 つを使用します。 通り名と家番号の異なるフィールド. 。もちろん、与えられた例では、これは問題を引き起こしません。しかし、オランダのアドレス システムは少し面倒な場合があります。
現実世界の例:
- Somestreet 88a (「Somestreet」は通りの名前、88a は番地)
- 2e van Blankenburgstraat 123a (「2e van Blankenburgstraat」は通り名、「123a」は番地)
- 2e van Blankenburgstraat 123-a (「2e van Blankenburgstraat」は通り名、「123-a」は番地)
- 2e van Blankenburgstraat 123 a (「2e van Blankenburgstraat」は通り名、「123 a」は番地)
ここで、これらのアドレス行を 2 つのフィールドに正しく分割する優れた関数 (RegEx など) を探しています。これを行うためのきれいな方法はありますか?
編集:
私たちのアドレス システムについてさらに調査を行ったところ、(政府に感謝します)上記の例は「最悪」の例ですらないようです。
さらにいくつか (これらは実際の道路と番号です):
- Rivium 1e Straat 53/ET6 (「Rivium 1e Straat」は通り、「53/ET6」は番地)
- Plein 1940-1945 34 (「Plein 1940-1945」は通り、「34」は番地)
- アポロ 11 号-ラーン 11 (「アポロ 11 号-ラーン」は通り、「11」(2 番目) は番地)
- Charta 77 Vaart 159 3H (「Charta 77 Vaart」は通り名、「159 3H」は番地)
- Charta 77 Vaart 44/2 (「Charta 77 Vaart」は通り名、「44/2」は番地)
解決
データの正確ための最善の解決策は、あなたのためにこれを行うための機能を持って知られているアドレスAPIに対する既存のデータベースを比較することであろう。そうでなければあなただけのデータを、すべてのあなたの最良の推測といくつかを与えることはないにしている手動で見直されるべきである。
他のヒント
私がやったことが、私はそれが最もパフォーマンスソリューションであることを疑うには、アドレスを逆にして、あなたが数字を見つけて、それらすべてを取るまでの最初の部分を取得することです。すなわち、逆にアドレスの正規表現.*\d+
。
通りには数字が含まれている場合、これはあなたの問題を解決します。
あなたは、スペースで分割何かをし、その後、いくつかの内部文字列の最初の文字が整数であるかどうかを確認することができますか?
のように
char[] splits = new char[1];
splits[0] = ' ';
string[] split = addressLine.split(splits);
int splitLoc = -1, i;
for (i =1; i < split.Length; i++){//start at 1 to avoid the first '2e' streets
int theFirstDigit = -1;
try{
theFirstDigit = int.Parse(split[i].Substring(0,1));
}catch {
//ignore; parse fails with an exception
}
if (theFirstDigit != -1){
splitLoc = i;
break;
}
}
if (splitLoc < 0) return; //busted
string field1, field2;
for (i = 0; i < splitLoc; i++){
field1+= split[i] + " ";
}
for (i = splitLoc; i < split.Length; i++){
field2+= split[i] + " ";
}
あなたが「クリーン」で何を意味するかに依存しますが、すべてのアドレスが指定した方法で形成することができるかどうかは、それがうまくいくように見えています。
誰かがこのデータを入力することができ、あまりにも多くの異なる方法があります。
:私はしばしば私の住所を書きます123フーストリートアプト#3
つまり、通りの名前のどちらかの端にある家やアパートの番号と
これは私の問題だった場合は、は、私が「簡単」なものとフラグ人のレビューのために複雑なものを扱う正規表現を記述します。
あなたは国勢調査局から米国で通りの名前のリストを見つけることができますが、それはありますモンスターデータファイルの内部に埋め込ま