developer's diary

最近はc#のエントリが多いです

C# (dotnetcore) CsvHelperでKEN_ALL.CSVを読み込み、郵便番号から住所を返答するコンソールアプリ作成

KEN_ALL.CSVとは

日本郵便が無償配布している、郵便番号と住所の対応が収録されたcsvファイル

www.post.japanpost.jp

KEN_ALL.CSVのレイアウト

No. 項目 説明
1 全国地方公共団体コード(JIS X0401、X0402) 半角数字 全国地方公共団体コード - Wikipedia
2 (旧)郵便番号(5桁) 半角数字 1999年まで利用されていた郵便番号
3 郵便番号(7桁) 半角数字 現在利用されている郵便番号(ハイフンなし)
4 都道府県名  半角カタカナ
5 市区町村名  半角カタカナ
6 町域名  半角カタカナ
7 都道府県名  漢字
8 市区町村名  漢字
9 町域名  漢字
10 一町域が二以上の郵便番号で表される場合の表示 半角数字 「1」は該当、
「0」は該当せず
11 小字毎に番地が起番されている町域の表示 半角数字 「1」は該当、
「0」は該当せず
12 丁目を有する町域の場合の表示 半角数字 「1」は該当、
「0」は該当せず
13 一つの郵便番号で二以上の町域を表す場合の表示 半角数字 「1」は該当、
「0」は該当せず
14 更新の表示 半角数字 「0」は変更なし、「1」は変更あり、
「2」廃止(廃止データのみ使用)
15 変更理由 半角数字 「0」は変更なし、
「1」市政・区政・町政・分区・政令指定都市施行、
「2」住居表示の実施、
「3」区画整理、
「4」郵便区調整等、
「5」訂正、
「6」廃止(廃止データのみ使用)

NuGet

dotnetcoreで読み込む場合は、Shift-Jisを読み込む為、「System.Text.Encoding.CodePages」を利用。 CSVの解析は、単純に「CsvHelper」が便利なので利用。

NuGet Gallery | CsvHelper 15.0.5

NuGet Gallery | System.Text.Encoding.CodePages 4.7.1

Install-Package CsvHelper
Install-Package System.Text.Encoding.CodePages

プログラム

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;
using CsvHelper;
using CsvHelper.Configuration;

namespace KEN_ALL_CSV_READ
{
    /// <summary>
    /// 行オブジェクト
    /// </summary>
    internal class CsvRow
    {
        /// <summary>
        /// 全国地方公共団体コード(JIS X0401、X0402)
        /// </summary>
        public string col1 { get; set; }

        /// <summary>
        /// (旧)郵便番号(5桁)
        /// </summary>
        public string col2 { get; set; }

        /// <summary>
        /// 郵便番号(7桁)
        /// </summary>
        public string col3 { get; set; }

        /// <summary>
        /// 都道府県名(半角カタカナ)
        /// </summary>
        public string col4 { get; set; }

        /// <summary>
        /// 市区町村名(半角カタカナ)
        /// </summary>
        public string col5 { get; set; }

        /// <summary>
        /// 町域名(半角カタカナ)
        /// </summary>
        public string col6 { get; set; }

        /// <summary>
        /// 都道府県名(漢字)
        /// </summary>
        public string col7 { get; set; }

        /// <summary>
        /// 市区町村名(漢字)
        /// </summary>
        public string col8 { get; set; }

        /// <summary>
        /// 町域名(漢字)
        /// </summary>
        public string col9 { get; set; }

        /// <summary>
        /// 一町域が二以上の郵便番号で表される場合の表示
        /// </summary>
        public string col10 { get; set; }

        /// <summary>
        /// 小字毎に番地が起番されている町域の表示
        /// </summary>
        public string col11 { get; set; }

        /// <summary>
        /// 丁目を有する町域の場合の表示
        /// </summary>
        public string col12 { get; set; }

        /// <summary>
        /// 一つの郵便番号で二以上の町域を表す場合の表示
        /// </summary>
        public string col13 { get; set; }

        /// <summary>
        /// 更新の表示
        /// </summary>
        public string col14 { get; set; }

        /// <summary>
        /// 変更理由
        /// </summary>
        public string col15 { get; set; }
    }


    /// <summary>
    /// CSVと行オブジェクトのマッピング
    /// </summary>
    internal class CsvTable : ClassMap<CsvRow>
    {
        private CsvTable()
        {
            Map(c => c.col1).Index(0);//1番目
            Map(c => c.col2).Index(1);//2番目
            Map(c => c.col3).Index(2);//3番目
            Map(c => c.col4).Index(3);//4番目
            Map(c => c.col5).Index(4);//5番目
            Map(c => c.col6).Index(5);//6番目
            Map(c => c.col7).Index(6);//7番目
            Map(c => c.col8).Index(7);//8番目
            Map(c => c.col9).Index(8);//9番目
            Map(c => c.col10).Index(9);//10番目
            Map(c => c.col11).Index(10);//11番目
            Map(c => c.col12).Index(11);//12番目
            Map(c => c.col13).Index(12);//13番目
            Map(c => c.col14).Index(13);//14番目
            Map(c => c.col15).Index(14);//15番目
        }
    }


    class Program
    {

        //メモリ上の住所録データ
        private static List<CsvRow> Rows = new List<CsvRow>();

        //CSVファイルのパス
        private const string CSV_PATH = @"KEN_ALL.csv";

        static void Main(string[] args)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            ReadCsv();

            while (true)
            {
                Console.WriteLine("郵便番号を入力してください。");
                var postNo = Console.ReadLine();
                var flg = false;
                foreach (CsvRow row in Rows)
                {
                    if(row.col3 == postNo)
                    {
                        Console.Write(row.col7);
                        Console.Write(row.col8);
                        Console.WriteLine(row.col9);
                        flg = true;
                    }
                }
                if (!flg)
                {
                    Console.WriteLine("入力した郵便番号のデータが見つかりません。[{0}]", postNo);
                }

            }

        }

        static void ReadCsv()
        {
            //ファイルが無い場合は何もしない
            if (!System.IO.File.Exists(CSV_PATH)) return;

            using (var reader = new StreamReader(CSV_PATH, Encoding.GetEncoding("SHIFT_JIS")))
            using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
            {
                csv.Configuration.HasHeaderRecord = false;
                csv.Configuration.RegisterClassMap<CsvTable>();
                Rows.AddRange(csv.GetRecords<CsvRow>());
            }
        }
    }
}

結果

f:id:mitsugi-bb:20200922014534p:plain

参考

業務で「KEN_ALL.CSV」を使う場合は、他のリンクも参考にしておきましょう。

qiita.com

qiita.com

blog1.mammb.com

ken-all.hatenadiary.com