サンプルコード
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ファイルのデータが大量である場合、パフォーマンスが低下する可能性があることなどもあります。