【问题标题】:Join two csv recordsets加入两个 csv 记录集
【发布时间】:2020-11-30 12:53:45
【问题描述】:

我创建了两个单独的记录集,但我无法连接它们。

问题是最后一条 SQL。
这些记录将有超过 10 万条记录,因此将其粘贴到表单中太长了。
我想使用日期和时间列将它连接到一条记录中。

Sub aaa()
   
    Dim RS_full As Object
    Dim Rs_FLOAT As Object
    Dim Rs_STRING As Object
    Dim cn As Object
    Dim Server_Name As String
    Dim Database_Name As String
    Dim DataBase
    Dim SQLStr As String
    Dim n As Byte
    Dim k As Byte
    Dim FL As String
    Dim ST As String
    
    Set Rs_FLOAT = CreateObject("ADODB.Recordset")
    Set cN = CreateObject("ADODB.Connection")
    Set Rs_STRING = CreateObject("ADODB.Recordset")
    Set RS_full = CreateObject("ADODB.Recordset")

    Set DataBase = Application.FileDialog(msoFileDialogFilePicker)
    'DataBase.Show
    Database_Name = "C:\PRIVATE\"
    
    FL = "[kkk(2019).csv]"
    ST = "[aaa.csv]"
    cN.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & _
                   "Data Source=" & Database_Name & ";" & _
                   "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""")
    Rs_FLOAT.ActiveConnection = cN
    SQLStr = "select * from " & FL
    Rs_FLOAT.Open SQLStr, cN, 3, 1
    Rs_STRING.ActiveConnection = cN
    SQLStr = "select * from " & ST
    Rs_STRING.Open SQLStr, cN, 3, 1
    
    ' INNER JOIN PROBLEM....................................
    
    'SQLStr = "select * from " & ST & "," & FL
    SQLStr = "SELECT * FROM " & FL & " INNER JOIN " & ST & " ON " & "kkk(2019).Time = " & "[aaa.csv].Time Where kkk(2019).Time = " & "[aaa.csv].Time "
    RS_full.Open SQLStr, cN, 3, 1

    cN.Close
End Sub

【问题讨论】:

  • 您可以在同一个 SQL 语句中查询两个 CSV。

标签: sql vba csv


【解决方案1】:

这对我有用:

Dim cn As New ADODB.Connection, rs As ADODB.Recordset, dbName

dbName = "C:\Excel\SQL"

cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & _
           "Data Source='" & dbName & "';" & _
           "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""")

Set rs = cn.Execute(" select a.*, b.* from [File1.csv] a " & _
                    " inner join [File2.csv] b on a.TheDate = b.TheDate2 ")

Sheet1.UsedRange.ClearContents
Sheet1.Range("A1").CopyFromRecordset rs

cn.Close

【讨论】:

    【解决方案2】:

    我希望这是你想要的! 更改了文件名,更新了 SQL 并创建了将记录集写入工作表 1、2 和 3(结果)的过程。

    Option Explicit
    
    Sub join_csv_files()
        Dim RS_full As Object
        Dim Rs_FLOAT As Object
        Dim Rs_STRING As Object
        Dim cn As Object
        Dim Server_Name As String
        Dim Database_Name As String
        Dim DataBase
        Dim SQLStr As String
        Dim n As Byte
        Dim k As Byte
        Dim FL As String
        Dim ST As String
        
        Set Rs_FLOAT = CreateObject("ADODB.Recordset")
        Set cn = CreateObject("ADODB.Connection")
        Set Rs_STRING = CreateObject("ADODB.Recordset")
        Set RS_full = CreateObject("ADODB.Recordset")
        
        Set DataBase = Application.FileDialog(msoFileDialogFilePicker)
        
        ' File Path
        Database_Name = ThisWorkbook.Path & "\"
        
        ' Filenames
        FL = "File1.csv"
        ST = "File2.csv"
        
        cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & _
                       "Data Source=" & Database_Name & ";" & _
                       "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""")
                       
        ' Write File1 to sheet1
        Rs_FLOAT.ActiveConnection = cn
        SQLStr = "select * from " & FL
        Rs_FLOAT.Open SQLStr, cn, 3, 1
        Call RecordSetToWorksheet(Sheet1, Rs_FLOAT)
        
        ' Write File2 to sheet2
        Rs_STRING.ActiveConnection = cn
        SQLStr = "select * from " & ST
        Rs_STRING.Open SQLStr, cn, 3, 1
        Call RecordSetToWorksheet(Sheet2, Rs_STRING)
        
        ' SQL
        SQLStr = ""
        SQLStr = SQLStr & "SELECT T1.*, T2.Status "
        SQLStr = SQLStr & "FROM "
        SQLStr = SQLStr & FL & " as T1 INNER JOIN "
        SQLStr = SQLStr & ST & " as T2 "
        SQLStr = SQLStr & "ON T1.Time = T2.Time"
        Debug.Print SQLStr
        
        ' Write result to sheet3
        RS_full.Open SQLStr, cn, 3, 1
        Call RecordSetToWorksheet(Sheet3, RS_full)
        
        cn.Close
    End Sub
    
    Sub RecordSetToWorksheet(objSheet As Worksheet, objRecordSet As Object)
        Dim i As Long
        With objSheet
            .Cells.Delete
            For i = 1 To objRecordSet.Fields.Count
                .Cells(1, i).Value = objRecordSet.Fields(i - 1).Name
            Next
            .Cells(2, 1).CopyFromRecordset objRecordSet
            .Cells.Columns.AutoFit
        End With
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多