csvファイルからdbにインサートしたい
投稿者 るきお  (社会人)
投稿日時
2021/12/10 21:24:53
とりあえず、郵便番号のcsvを読み込んでデータベースにインサートするサンプルを作ってみました。
ここからダウンロードできます。
https://github.com/rucio-rucio/PGSample/archive/refs/heads/main.zip
ここで公開しているのでダウンロードしないでソースコードだけ眺めることもできます。
https://github.com/rucio-rucio/PGSample/tree/main/samples/CSV2DB_VB/CSV2DB_VB
Visual Studio 2022 でVBで .NET 6.0を使って、Windows フォーム アプリで作成してみました。
データベースにはSQLite を使っています。
核心部分のプログラムだけここに転記します。
ここからダウンロードできます。
https://github.com/rucio-rucio/PGSample/archive/refs/heads/main.zip
ここで公開しているのでダウンロードしないでソースコードだけ眺めることもできます。
https://github.com/rucio-rucio/PGSample/tree/main/samples/CSV2DB_VB/CSV2DB_VB
Visual Studio 2022 でVBで .NET 6.0を使って、Windows フォーム アプリで作成してみました。
データベースにはSQLite を使っています。
核心部分のプログラムだけここに転記します。
Option Strict On
Imports Microsoft.Data.Sqlite
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'▼ファイルのダイアログからcsvファイルを取得
Dim dialog As New OpenFileDialog
dialog.Filter = "CSVファイル|*.csv|すべてのファイル|*.*"
dialog.InitialDirectory = Application.StartupPath
dialog.FileName = "19YAMANA.CSV"
If dialog.ShowDialog = DialogResult.Cancel Then
Return
End If
Dim csvFileName As String = dialog.FileName
'▼dbにインサート
'データ格納用のテーブルがなければ作成
Using database As New SqliteConnection("Data Source=mydatabase.db")
Using sql = database.CreateCommand
sql.CommandText = "CREATE TABLE IF NOT EXISTS postal(" &
"PostalCode TEXT, " &
"Address TEXT)"
database.Open()
sql.ExecuteNonQuery()
database.Close()
End Using
End Using
'CSVを読み込んでデータベースに格納
Const maxCount As Integer = 100 'サンプルなので最大100件まで処理することにします。
Dim count As Integer
Using database As New SqliteConnection("Data Source=mydatabase.db")
'.NET Frameworkで実行する場合、この行は不要でエラーになるのでコメント化すること
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
Dim reader As New IO.StreamReader(csvFileName, System.Text.Encoding.GetEncoding("shift_jis"))
database.Open()
Do Until reader.EndOfStream
Dim line As String = reader.ReadLine
Dim items As String() = line.Split(",")
Dim postalCode As String = items(2).Trim(""""c)
Dim address As String = (items(6) & items(7) & items(8)).Replace("""", "")
InsertToDb(database, postalCode, address)
count += 1
If count = maxCount Then
Exit Do
End If
Loop
database.Close()
End Using
'▼ちゃんとデータベースに格納されたか確認
'データベースから読み込んで画面上のDataGridView1に表示します。
Using database As New SqliteConnection("Data Source=mydatabase.db")
database.Open()
Dim table As DataTable = ReadDb(database)
database.Close()
DataGridView1.DataSource = table
End Using
End Sub
Private Sub InsertToDb(database As SqliteConnection, postalCode As String, address As String)
Using sql = database.CreateCommand
sql.CommandText = "INSERT INTO postal VALUES (@postalCode, @address)"
sql.Parameters.AddWithValue("@postalCode", postalCode)
sql.Parameters.AddWithValue("@address", address)
sql.ExecuteNonQuery()
End Using
End Sub
Private Function ReadDb(database As SqliteConnection) As DataTable
Dim table As New DataTable
table.Columns.Add("postalCode", GetType(String))
table.Columns.Add("address", GetType(String))
Using sql = database.CreateCommand
sql.CommandText = "SELECT * FROM postal"
Using reader As SqliteDataReader = sql.ExecuteReader
Do While reader.Read
table.Rows.Add(reader("postalCode"), reader("address"))
Loop
End Using
End Using
Return table
End Function
End Class
投稿者 るきお  (社会人)
投稿日時
2021/12/10 21:28:49
前提としてSQLLiteを使用するために下記の2つのパッケージをNuGetでインストールする必要があります。
Microsoft.Data.Sqlite.Core
SQLitePCLRaw.bundle_e_sqlite3
また、csvファイルはここからダウントードしたものを使用します。
https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html
これをexeと同じパスに存在するように配置するのがベターです。
上記のリンクからダウンロードしていただければ、こういったことはすべて織り込み済みですぐ実行できるものを入手できます。
Microsoft.Data.Sqlite.Core
SQLitePCLRaw.bundle_e_sqlite3
また、csvファイルはここからダウントードしたものを使用します。
https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html
これをexeと同じパスに存在するように配置するのがベターです。
上記のリンクからダウンロードしていただければ、こういったことはすべて織り込み済みですぐ実行できるものを入手できます。
投稿者 ケンケン  (社会人)
投稿日時
2021/12/13 16:08:17
丁寧な回答ありがとうございます。
参考にさせて貰います。
参考にさせて貰います。
よろしくお願い致します。