住所を入力するときに県名を選択すれば自動的に市の名前や地名が表示され、これを選択すれば住所を取得することができるアプリケーションをつくりました。
まず地名のリストが必要です。ここから入手しました。
読み仮名データの促音・拗音を小書きで表記するもの – zip圧縮形式 日本郵便
これを開いてみるとこのようになっています。
A列、B列、J列以降は必要ないので消してしまいましょう。上書き保存してテキストエディタで開いてみると、
1 2 3 4 5 6 7 |
600000,ホッカイドウ,サッポロシチュウオウク,イカニケイサイガナイバアイ,北海道,札幌市中央区, 640941,ホッカイドウ,サッポロシチュウオウク,アサヒガオカ,北海道,札幌市中央区,旭ケ丘 600041,ホッカイドウ,サッポロシチュウオウク,オオドオリヒガシ,北海道,札幌市中央区,大通東 600042,ホッカイドウ,サッポロシチュウオウク,オオドオリニシ(1-19チョウメ),北海道,札幌市中央区,大通西(1~19丁目) 640820,ホッカイドウ,サッポロシチュウオウク,オオドオリニシ(20-28チョウメ),北海道,札幌市中央区,大通西(20~28丁目) 600031,ホッカイドウ,サッポロシチュウオウク,キタ1ジョウヒガシ,北海道,札幌市中央区,北一条東 ・・・・以下続く |
このようになっています。
カンマで分割して「県名」「市」「地名」、漢字とふりがな部分にわけてしまいましょう。
まずDataクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public class Data { public Data(string kenFurigana, string cityFurigana, string nameFurigana, string ken, string city, string name) { KenFurigana = kenFurigana; CityFurigana = cityFurigana; NameFurigana = nameFurigana; Ken = ken; City = city; Name = name; } public string KenFurigana { get; private set; } public string CityFurigana { get; private set; } public string NameFurigana { get; private set; } public string Ken { get; private set; } public string City { get; private set; } public string Name { get; private set; } } |
先ほどのファイルはken_all.csvという名前でアプリケーションの実行ファイルと同じフォルダに置いておきます。アプリケーションが開始されたらこれを開いて1行ずつ読み込みます。カンマで文字列を分割して、県、市、地名をオブジェクトのなかに格納し、これをリストのなかに追加していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public partial class Form1 : Form { List<Data> Datas = new List<Data>(); void ReadCsv() { string path = Application.StartupPath + "\\ken_all.csv"; StreamReader sr = new StreamReader(path, Encoding.GetEncoding("sjis")); Datas.Clear(); while(true) { string str = sr.ReadLine(); if(str == null) break; string[] strs = str.Split(new char[] { ',' }); Datas.Add(new Data(strs[1], strs[2], strs[3], strs[4], strs[5], strs[6])); } sr.Close(); } } |
一番左のリストボックスには県名を表示させます。Data.Kenの重複をなくして残ったものをリストボックスに表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); ReadCsv(); List<Data> datas = Datas.Distinct(new KenEqualityComparer()).ToList(); listBox1.Items.Clear(); foreach(Data data in datas) listBox1.Items.Add(data.Ken); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class KenEqualityComparer : IEqualityComparer<Data> { public bool Equals(Data x, Data y) { if(x.Ken == y.Ken) return true; else return false; } public int GetHashCode(Data obj) { return 0; } } |
県名が選択されたら、どれが選択されているか調べて、その県の市を2番目のリストボックスに表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); listBox1.SelectedIndexChanged += ListBox1_SelectedIndexChanged; listBox2.SelectedIndexChanged += ListBox2_SelectedIndexChanged; listBox3.SelectedIndexChanged += ListBox3_SelectedIndexChanged; ReadCsv(); List<Data> datas = Datas.Distinct(new KenEqualityComparer()).ToList(); listBox1.Items.Clear(); foreach(Data data in datas) listBox1.Items.Add(data.Ken); } private void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { ShowCities(); listBox2.SelectedIndex = -1; // 3番目のリストボックスはクリアする // 2番目のリストボックスの内容が変更されどれも選択されていない状態では表示すべきものは未確定である listBox3.Items.Clear(); textBox1.Text = ""; } void ShowCities() { int index = listBox1.SelectedIndex; if(index == -1) return; string ken = (string)listBox1.Items[index]; List<Data> kenDatas = Datas.Where(x => x.Ken == ken).ToList(); List<Data> cityDatas = kenDatas.Distinct(new CityEqualityComparer()).ToList(); // 50音順に並べて区切りも入れる cityDatas.Add(new Data("", "ア", "", "", " ア ========", "")); cityDatas.Add(new Data("", "カ", "", "", " カ ========", "")); cityDatas.Add(new Data("", "サ", "", "", " サ ========", "")); cityDatas.Add(new Data("", "タ", "", "", " タ ========", "")); cityDatas.Add(new Data("", "ナ", "", "", " ナ ========", "")); cityDatas.Add(new Data("", "ハ", "", "", " ハ ========", "")); cityDatas.Add(new Data("", "マ", "", "", " マ ========", "")); cityDatas.Add(new Data("", "ヤ", "", "", " ヤ ========", "")); cityDatas.Add(new Data("", "ラ", "", "", " ラ ========", "")); cityDatas.Add(new Data("", "ワ", "", "", " ワ ========", "")); cityDatas = cityDatas.OrderBy(x => x.CityFurigana).ToList(); listBox2.Items.Clear(); foreach(Data data in cityDatas) listBox2.Items.Add(data.City); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class CityEqualityComparer : IEqualityComparer<Data> { public bool Equals(Data x, Data y) { if(x.City == y.City) return true; else return false; } public int GetHashCode(Data obj) { return 0; } } |
市が選択されたら3番目のリストボックスに地名を表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public partial class Form1 : Form { private void ListBox2_SelectedIndexChanged(object sender, EventArgs e) { ShowNames(); listBox3.SelectedIndex = -1; textBox1.Text = ""; } void ShowNames() { int index1 = listBox1.SelectedIndex; if(index1 == -1) return; int index2 = listBox2.SelectedIndex; if(index2 == -1) return; string ken = (string)listBox1.Items[index1]; string city = (string)listBox2.Items[index2]; List<Data> cityDatas = Datas.Where(x => x.Ken == ken && x.City == city).ToList(); List<Data> nameDatas = cityDatas.Distinct(new NameEqualityComparer()).ToList(); // 50音順に並べて区切りも入れる nameDatas.Add(new Data("", "", "ア", "", "", " ア ========")); nameDatas.Add(new Data("", "", "カ", "", "", " カ ========")); nameDatas.Add(new Data("", "", "サ", "", "", " サ ========")); nameDatas.Add(new Data("", "", "タ", "", "", " タ ========")); nameDatas.Add(new Data("", "", "ナ", "", "", " ナ ========")); nameDatas.Add(new Data("", "", "ハ", "", "", " ハ ========")); nameDatas.Add(new Data("", "", "マ", "", "", " マ ========")); nameDatas.Add(new Data("", "", "ヤ", "", "", " ヤ ========")); nameDatas.Add(new Data("", "", "ラ", "", "", " ラ ========")); nameDatas.Add(new Data("", "", "ワ", "", "", " ワ ========")); nameDatas = nameDatas.OrderBy(x => x.NameFurigana).ToList(); listBox3.Items.Clear(); foreach(Data data in nameDatas) listBox3.Items.Add(data.Name); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class NameEqualityComparer : IEqualityComparer<Data> { public bool Equals(Data x, Data y) { if(x.Name == y.Name) return true; else return false; } public int GetHashCode(Data obj) { return 0; } } |
そして地名が選択されたら住所をテキストボックスに表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { private void ListBox3_SelectedIndexChanged(object sender, EventArgs e) { GetName(); } void GetName() { int index1 = listBox1.SelectedIndex; int index2 = listBox2.SelectedIndex; int index3 = listBox3.SelectedIndex; if(index1 == -1 || index2 == -1 || index3 == -1) { textBox1.Text = ""; return; } string ken = (string)listBox1.Items[index1]; string city = (string)listBox2.Items[index2]; string cho = (string)listBox3.Items[index3]; textBox1.Text = String.Format("{0}{1}{2}", ken, city, cho); } } |