郵便番号データをDBに登録する

少し長いが郵便番号データcsvを読み込みテーブルに登録するコードを以下に記す。

private void buttonUpdateZip_Click(object sender, RoutedEventArgs e)
{
    Cursor = Cursors.Wait;

    using (StreamReader stream = new StreamReader(VM.ZipFileName))
    {
        List<MstAddress> addresses = new List<MstAddress>();
        List<MstZip> zips = new List<MstZip>();
        List<MstCity> cities = new List<MstCity>();
        List<MstPrefecture> prefectures = new List<MstPrefecture>();
        string? line = string.Empty;
        while ((line = stream.ReadLine()) != null)
        {
            line = line.Replace("\"", "");
            string[] strings = line.Split(new char[] { ',' }, StringSplitOptions.TrimEntries);
                    
            // 住所マスタ
            MstAddress mstAddress = new MstAddress()
            {
                GovCode = strings[0],
                ZipCodeOld = strings[1],
                ZipCode = strings[2],
                PrefKana = strings[3],
                CityCana = strings[4],
                TownKana = strings[5],
                Pref = strings[6],
                City = strings[7],
                Town = strings[8],
                Code1 = int.Parse(strings[9]),
                Code2 = int.Parse(strings[10]),
                Code3 = int.Parse(strings[11]),
                Code4 = int.Parse(strings[12]),
                Code5 = int.Parse(strings[13]),
                Code6 = int.Parse(strings[14])
            };
            addresses.Add(mstAddress);
            // 都道府県マスタ
            MstPrefecture pref = new MstPrefecture()
            {
                Pref = mstAddress.Pref,
                PrefKana = mstAddress.PrefKana
            };
            prefectures.Add(pref);

            // 市区町村マスタ
            MstCity city = new MstCity()
            {
                GovCode = mstAddress.GovCode,
                Pref = mstAddress.Pref,
                City = mstAddress.City
            };
            cities.Add(city);

            // 郵便番号マスタ
            MstZip zip = new MstZip()
            {
                GovCode = mstAddress.GovCode,
                ZipCode = mstAddress.ZipCode,
                Town = mstAddress.Town
            };

            List<string> listTowns = new List<string>();

            // 数値は半角に変換する。
            string town = Regex.Replace(zip.Town, "[0-9]", p => ((char)(p.Value[0] - '0' + '0')).ToString());

            // 正規表現【(.*?)】にマッチする文字列を削除する。ただし、(xx階)は残す。【([0-9]*階)】
            Regex regex = new Regex(@"(.*?)");
            if (regex.IsMatch(town) == true)
            {
                // (xx階)が含まれていない場合、除去する
                if (Regex.IsMatch(town, @"([0-9]*階)") == false)
                {
                    town = regex.Replace(town, "");
                }
            }

            // 【、】を含む文字列は分割し、2レコードにする。
            if (town.IndexOf("、") != -1)
            {
                string[] towns = town.Split("、");
                if (towns.Length == 2)
                {
                    listTowns.AddRange(towns);
                }
            }

            // 【~】を含む文字列は数値を検出し分割する。ただし、99を超える場合は削除する。
            else if (town.IndexOf("〜") != -1)
            {
                string[] towns = town.Split("〜");
                if (towns.Length == 2)
                {
                    int num1, num2;
                    regex = new Regex(@"[0-9].");
                    if (int.TryParse(regex.Match(towns[0]).Value, out num1) && int.TryParse(regex.Match(towns[1]).Value, out num2))
                    {
                        if (num2 < 100)
                        {
                            string s = regex.Replace(towns[0], "{0}");
                            for (int i = num1; i <= num2; i++)
                            {
                                listTowns.Add(string.Format(s, i));
                            }
                        }
                    }
                }
            }

            // 未処理データ
            else
            {
                listTowns.Add(town);
            }

            // データ追加
            foreach (string s in listTowns)
            {
                zips.Add(new MstZip
                {
                    ZipCode = zip.ZipCode,
                    GovCode = zip.GovCode,
                    Town = Regex.Replace(s, "[0-9]", p => ((char)(p.Value[0] - '0' + '0')).ToString())
                });
            }
        }

        using (var lc = new LearnContext())
        {
            // 都道府県マスタ
            lc.Database.ExecuteSqlRaw(@"delete from mst_prefecture");
            lc.MstPrefectures.AddRange(prefectures.Distinct(new MstPrefComparer()));
            lc.Database.ExecuteSqlRaw(@"DBCC CHECKIDENT ('mst_prefecture', RESEED, 0)");

            // 市区町村マスタ
            lc.Database.ExecuteSqlRaw(@"delete from mst_city");
            lc.MstCities.AddRange(cities.Distinct(new MstCityComparer()));

            // 郵便番号マスタ
            lc.Database.ExecuteSqlRaw(@"delete from mst_zip");
            lc.MstZips.AddRange(zips.Distinct(new MstZipComparer()));
            lc.Database.ExecuteSqlRaw(@"DBCC CHECKIDENT ('mst_zip', RESEED, 0)");
                    
            lc.SaveChanges();
        }
    }
    Cursor = Cursors.Arrow;
    MessageBox.Show("登録終了", this.Title);
}

トップページ

コメント

タイトルとURLをコピーしました