サンプルコード


Sub CsvToPostgreSQL()

    ' 変数定義
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim csvFile As String
    Dim csvData As Variant
    Dim primaryKey As String
    Dim sql As String
    Dim i As Long
    
    ' CSVファイルのパスを取得
    csvFile = "C:\path\to\csv\file.csv"
    
    ' PostgreSQL12に接続
    Set conn = New ADODB.Connection
    conn.ConnectionString = "Driver={PostgreSQL Unicode};Server=localhost;Port=5432;Database=dbname;Uid=username;Pwd=password;"
    conn.Open
    
    ' レコードセットを作成
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open "SELECT * FROM tablename", conn, adOpenStatic, adLockOptimistic
    
    ' CSVファイルを開く
    Open csvFile For Input As #1
    
    ' CSVファイルから1行ずつデータを読み込む
    While Not EOF(1)
        Line Input #1, csvData
        ' CSVデータを区切り文字で分割する
        csvData = Split(csvData, ",")
        ' 主キーを取得
        primaryKey = csvData(0)
        ' レコードセットで主キーが存在するかどうかを確認する
        rs.Filter = "primaryKey = '" & primaryKey & "'"
        If rs.RecordCount > 0 Then
            ' 存在する場合は更新する
            rs.Fields("column1") = csvData(1)
            rs.Fields("column2") = csvData(2)
            rs.Update
        Else
            ' 存在しない場合は追加する
            rs.AddNew
            rs.Fields("primaryKey") = primaryKey
            rs.Fields("column1") = csvData(1)
            rs.Fields("column2") = csvData(2)
            rs.Update
        End If
    Wend
    
' CSVファイルを閉じる
Close #1

' レコードセットを閉じる
rs.Close

' PostgreSQL12から切断する
conn.Close

' 変数を解放する
Set rs = Nothing
Set conn = Nothing

解説

このコードは、CSVファイルから1行ずつデータを読み込み、PostgreSQL12でレコードセットを作成しています。

レコードセットで、主キーが存在するかどうかを確認し、存在しない場合は新しいレコードを追加し、存在する場合はレコードを更新します。

 

ただし、このコードにはいくつかの問題があります。

たとえば、主キーが数値型である場合、フィルタリングの際に文字列型に変換する必要があることなどがあります。

また、CSVファイルのデータが大量である場合、パフォーマンスが低下する可能性があることなどもあります。