やりたいこと
郵便番号を入力した時に、テキストボックスに自動で都道府県、市町村、町名を入力したい。
↓ 以下実装方法
全国の住所が書かれたcsvファイルを取得する
https://www.post.japanpost.jp/zipcode/dl/utf-zip.html
日本郵政のサイトでUTF-8のcsvファイルを取得する。
csvファイルのいらない列を削除する
csvファイルを取得した直後は、以下のような内容が書かれている。
欲しいところは郵便番号~町名 までなので、他の文字列を削除する。
csvファイルをExcelにインポートする
いらない列を削除する
csvファイルとして保存する
ファイルの種類は、CSV UTF-8(コンマ区切り)(*.csv)
を選択する。
VisualStudioでcsvファイルを埋め込みリソースにする
ソリューションエクスプローラーで、Resourcesフォルダを選択する。
右クリックで 追加 > 既存の項目
を選択しcsvファイルを追加する。
追加したファイルを選択し、プロパティでビルドアクションを埋め込みリソース
にする。
埋め込みリソース(csvファイル)を読み込む
Imports System.IO.StreamReader
Imports System.Text.Encoding
Public Class Form1
Private resourceName As String = "manageBusinessCardApp.test.csv"
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 埋め込んだcsvファイルを取得する
' 現在のコードを実行しているアセンブリを取得
Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
' 埋め込みリソースを取得する
Dim sr As New System.IO.StreamReader(assembly.GetManifestResourceStream(resourceName), System.Text.Encoding.GetEncoding("UTF-8"))
End Sub
End Class
-
resourceName
:リソース(csvファイル)の名前空間を指定。(基本的にはプロジェクトの名前空間
.ファイル名
) -
StreamReader()
:csvファイルの読み込み、値の取得に便利な関数が多い。
- GetManifestResourceStream()
:埋め込みリソースを読み込むための関数 -
System.Text.Encoding.GetEncoding("UTF-8")
:エンコードは必ず指定する。(指定しないと文字化けが発生する。)
埋め込みリソース(csvファイル)をDataTableに変換する
Public Class Form1
' :
' DataTableのカラム名
Public Enum KenColumnName
POST_CODE
PREFECTURE_KANA
MUNICIPALITIES_KANA
TOWN_KANA
PREFECTURE
MUNICIPALITIES
TOWN
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' :
Dim dt As New DataTable
dt.Columns.Add(KenColumnName.POST_CODE)
dt.Columns.Add(KenColumnName.PREFECTURE_KANA)
dt.Columns.Add(KenColumnName.MUNICIPALITIES_KANA)
dt.Columns.Add(KenColumnName.TOWN_KANA)
dt.Columns.Add(KenColumnName.PREFECTURE)
dt.Columns.Add(KenColumnName.MUNICIPALITIES)
dt.Columns.Add(KenColumnName.TOWN)
Dim dtColCount As Integer = dt.Columns.Count() ' DataTableの列数
' csvファイルを最後まで読み取る
While sr.Peek >= 0
Dim line As String() = sr.ReadLine.Split(","c) ' 1行ずつ読み取る。カンマを区切り文字にして配列に格納する
Dim elementCount As Integer = 0 ' dt作成時の要素数カウント用
Dim row As DataRow = dt.NewRow()
For Each item As String In line
row(elementCount) = item
elementCount += 1
If elementCount = dtColCount Then
dt.Rows.Add(row) ' dtに行を追加
dt.NewRow() ' 新しい行を作成
Exit For
End If
Next item
End While
dt.AcceptChanges()
' ファイルを閉じる
sr.Close()
' DGVに表示する
Me.DataGridView1.DataSource = dt
End Sub
End Class
-
sr.Peek
:コンマ区切りの文字列がなくなるまでループする -
sr.ReadLine.Split(","c)
:1行読み取り、コンマ区切りの文字列をline配列に格納する。 - line配列からDataTableに値を格納する仕組み:
-
dt.AcceptChanges()
:DataTableの変更を確定する。
テキストボックスに住所を表示する
Dim strPostCode As String = TextBoxPostCode.Text
Dim strAddress As String = ""
For Each row As DataRow In dt.Rows
If row.Item(KenColumnName.POST_CODE).ToString = strPostCode Then
strAddress = row.Item(KenColumnName.PREFECTURE)
strAddress &= row.Item(KenColumnName.MUNICIPALITIES)
strAddress &= row.Item(KenColumnName.TOWN)
TextBox5.Text = strAddress
End If
Next
- if文の仕組み
- 入力した郵便番号とDataTable内の郵便番号が一致した場合
- 都道府県、市町村、町名を連結してテキストボックスに表示する。
すべてのコード
Imports System.IO.StreamReader
Imports System.Text.Encoding
Public Class Form1
Public Enum KenColumnName
POST_CODE
PREFECTURE_KANA
MUNICIPALITIES_KANA
TOWN_KANA
PREFECTURE
MUNICIPALITIES
TOWN
End Enum
Private resourceName As String = "manageBusinessCardApp.utf_ken_all_new.csv"
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 埋め込んだcsvファイルを取得する
Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly() ' 現在のコードを実行しているアセンブリを取得
Dim sr As New System.IO.StreamReader(assembly.GetManifestResourceStream(resourceName), System.Text.Encoding.GetEncoding("UTF-8"))
Dim dt As New DataTable
dt.Columns.Add(KenColumnName.POST_CODE)
dt.Columns.Add(KenColumnName.PREFECTURE_KANA)
dt.Columns.Add(KenColumnName.MUNICIPALITIES_KANA)
dt.Columns.Add(KenColumnName.TOWN_KANA)
dt.Columns.Add(KenColumnName.PREFECTURE)
dt.Columns.Add(KenColumnName.MUNICIPALITIES)
dt.Columns.Add(KenColumnName.TOWN)
Dim dtColCount As Integer = dt.Columns.Count() ' dtの列数
' csvファイルを最後まで読み取る
While sr.Peek >= 0
Dim line As String() = sr.ReadLine.Split(","c) ' 1行ずつ読み取る。カンマを区切り文字にして配列に格納する
Dim elementCount As Integer = 0 ' dt作成時の要素数カウント用
Dim row As DataRow = dt.NewRow()
For Each item As String In line
row(elementCount) = item
elementCount += 1
If elementCount = dtColCount Then
dt.Rows.Add(row) ' dtに行を追加
dt.NewRow() ' 新しい行を作成
Exit For
End If
Next item
End While
dt.AcceptChanges()
' ファイルを閉じる
sr.Close()
' DGVに表示する
Me.DataGridView1.DataSource = dt
' テキストボックスに住所を表示する
Dim strPostCode As String = TextBoxPostCode.Text
Dim strAddress As String = ""
For Each row As DataRow In dt.Rows
If row.Item(KenColumnName.POST_CODE).ToString = strPostCode Then
strAddress = row.Item(KenColumnName.PREFECTURE)
strAddress &= row.Item(KenColumnName.MUNICIPALITIES)
strAddress &= row.Item(KenColumnName.TOWN)
TextBox5.Text = strAddress
End If
Next
End Sub
End Class
番外編
csvファイルを埋め込みリソースではなく、csvファイルとして扱う場合は、TextFieldParser
クラスを使用すると簡単にDataTableにすることが可能。
https://aonopage.com/text-field-parser/
https://dobon.net/vb/dotnet/file/readcsvfile.html
参考サイト
Excel関連
VB.NET関連