C# (dotnetcore) CsvHelperでKEN_ALL.CSVを読み込み、郵便番号から住所を返答するコンソールアプリ作成
KEN_ALL.CSVとは
日本郵便が無償配布している、郵便番号と住所の対応が収録されたcsvファイル
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>()); } } } }
結果
参考
業務で「KEN_ALL.CSV」を使う場合は、他のリンクも参考にしておきましょう。