0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【VB.NET】住所を自動入力する機能について

Posted at

やりたいこと

郵便番号を入力した時に、テキストボックスに自動で都道府県、市町村、町名を入力したい。
image.png

↓ 以下実装方法


全国の住所が書かれたcsvファイルを取得する

https://www.post.japanpost.jp/zipcode/dl/utf-zip.html
日本郵政のサイトでUTF-8のcsvファイルを取得する。


csvファイルのいらない列を削除する

csvファイルを取得した直後は、以下のような内容が書かれている。
image.png
欲しいところは郵便番号~町名 までなので、他の文字列を削除する。

csvファイルをExcelにインポートする

  • 文字コードがUnicode(UTF-8)になっていることを確認する。
    image.png

  • 郵便番号の列はtext型に変更する。(0で始まる郵便番号の場合、0が消えてしまうため。)
    image.png

いらない列を削除する

  • A、B、H~最後の列を削除する。
    image.png

  • ヘッダー列もいらないので削除する。
    テーブルデザインタブ > ツール > 範囲に変換 を選択後、ヘッダー列を削除する。
    image.png

csvファイルとして保存する

ファイルの種類は、CSV UTF-8(コンマ区切り)(*.csv) を選択する。
image.png


VisualStudioでcsvファイルを埋め込みリソースにする

ソリューションエクスプローラーで、Resourcesフォルダを選択する。
右クリックで 追加 > 既存の項目 を選択しcsvファイルを追加する。
image.png


追加したファイルを選択し、プロパティでビルドアクションを埋め込みリソースにする。
image.png


埋め込みリソース(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に値を格納する仕組み:
    • DataTableの各セルに値を追加するたびに、elementCountをインクリメントする。
    • elementCountの値がDataTableの列数と同じになったら、新しい行を追加する。
      image.png
  • 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関連

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?