csvファイルからdbにインサートしたい

タグの編集
投稿者 ケンケン  (社会人) 投稿日時 2021/12/10 11:36:20
ファイルのダイアログから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 を使っています。

核心部分のプログラムだけここに転記します。
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と同じパスに存在するように配置するのがベターです。

上記のリンクからダウンロードしていただければ、こういったことはすべて織り込み済みですぐ実行できるものを入手できます。
投稿者 ケンケン  (社会人) 投稿日時 2021/12/13 16:08:17
丁寧な回答ありがとうございます。
参考にさせて貰います。