○VB6 DAO アクセスデータベースへLF区切りのCSVファイルを読み書き

db1.mdb にはTABLEというテーブルがあり、任意のフィールドがあるとします。

Command1ボタンをクリックすることにより、TABLEのフィールド名と内容を
out.csvファイルに改行文字LFで書き込みます。

Command2ボタンをクリックすることにより、CSVファイルをTABLEに読み込みます。
in.csvファイルの先頭行にはTABLEのフィールド名と同一のデータがカンマ区切りで
書かれており、改行文字はLFで2行目から値が書き込まれています。




'--------------------------------------------------------
'データベースの内容をLF区切りのCSVファイルに書き出す
'--------------------------------------------------------
Private Sub Command1_Click()
    Dim filename As String
    filename = "./out.csv"
    On Error Resume Next
    Kill filename
    On Error GoTo 0
    
    Open filename For Binary As #1
    
    '-----------初期設定---------------
    Dim MyDB As Database
    Set MyDB = OpenDatabase("./db1.mdb") 'データーベースファイルのオープン
    
    '-----------レコードセットを開く-----------
    Dim MyTable As Recordset
    Set MyTable = MyDB.OpenRecordset("select * from [TABLE]") 'SQL実行によりレコードの取得
    
    Dim i As Long
    
    'フィールド名を出力する
    Put #1, , """" & MyTable.Fields(0).Name & """"
    For i = 1 To MyTable.Fields.Count - 1
        Put #1, , ","""
        Put #1, , MyTable.Fields(i).Name
        Put #1, , """"
    Next i
    Put #1, , vbLf
    
    '値を出力する
    MyTable.MoveFirst '先頭の位置に移動
    Do While Not MyTable.EOF 'EOFになるまでループ
        If Not IsNull(MyTable.Fields(0)) Then
            Put #1, , """" & CStr(MyTable.Fields(0)) & """" '現在のレコード位置の値を表示
            For i = 1 To MyTable.Fields.Count - 1
                If Not IsNull(MyTable.Fields(i)) Then
                    Put #1, , ","""
                    Put #1, , CStr(MyTable.Fields(i)) '現在のレコード位置の値を表示
                    Put #1, , """"
                Else
                    Put #1, , ","""""
                End If
            Next i
            Put #1, , vbLf
        End If
        MyTable.MoveNext
    Loop
    
    MyTable.Close
    MyDB.Close
    Close #1
End Sub

'--------------------------------------------------------
'LF区切りのCSVファイルの内容をデータベースに書き込む
'--------------------------------------------------------
Private Sub Command2_Click()
    'LFで区切られたCSVファイルをDBに入れる
    Dim filename As String
    Dim pos As String
    Dim ar() As String
    '要素数
    Dim ar_len As Long
    Dim i As Long
    
    filename = Dir("./in.csv")
    
    Dim MyDB As Database
    Set MyDB = OpenDatabase("./db1.mdb") 'データーベースファイルのオープン、フルパスの指定が必要
    
    'レコードを削除するSQL文を実行
    Dim strSQL As String
    strSQL = ""
    strSQL = strSQL & " DELETE * FROM "
    strSQL = strSQL & "[TABLE]"
    MyDB.Execute strSQL
    'レコードセットを開く
    Dim MyTable As Recordset
    Set MyTable = MyDB.OpenRecordset("select * from [TABLE]") 'SQL実行によりレコードの取得
    
    Open filename For Binary Access Read As #1
    
    'カラム名を読み、要素数とする
    ar = Split(lineInputLF(1), ",")
    ar_len = UBound(ar)
    
    'フィールドの整合性チェック
    If (MyTable.Fields.Count - 1 <> ar_len) Then
        MsgBox ("ファイルの要素数とデータベースのフィールド数が違っています")
        End
    Else
        For i = 0 To ar_len
            If (MyTable.Fields(i).Name <> Replace(ar(i), """", "")) Then
                MsgBox ("ファイルのフィールド名とデータベースのフィールド名が一致していません")
                End
            End If
        Next i
    End If
    
    Do Until EOF(1)
        ar = Split(lineInputLF(1), ",")
        If (UBound(ar) = ar_len) Then
            '配列の長さが正しいためDBに登録する
            MyTable.AddNew '新しいレコードの追加
            Dim strpos As String
            For i = 0 To ar_len
                strpos = Replace(ar(i), """", "")
                If (strpos <> "") Then MyTable.Fields(i) = strpos
            Next i
            MyTable.Update 'データーベースに反映
        Else
            '配列の長さが異常である
            If (UBound(ar) > 0) Then
                '要素数が0以上のため元データの区切り文字が間違っている
                MsgBox (ar(0))
            End If
        End If
    Loop
    
    Close #1
    MyTable.Close
    MyDB.Close
End Sub

'--------------------------------------------------------
'LF区切りの一行を読み出す
'--------------------------------------------------------
Private Function lineInputLF(fileNo As Integer) As String
    Dim str As String
    Dim pos As String
    pos = String(1, " ")
    
    Do Until EOF(fileNo)
      Get #fileNo, , pos
      If pos = vbLf Then Exit Do
      str = str + pos
    Loop
    lineInputLF = str
End Function





▲トップページ > Visual BASIC と C#