sql - 在 Excel 中使用 SQL 组合来自不同位置的文件
问题描述
我正在尝试将来自不同文件位置的不同文件组合到一个电子表格中。我在网上找到了一些代码,如果它们来自同一位置,我可以在 VBA 中使用 SQL 将它们组合起来:
代码摘录在这里:
Sub sample()
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.path & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
StrSQL="SELECT * FROM samplesheet.csv"
objRecordSet.Open StrSQL
...
End Sub
在上面的代码中,我只能指定一个位置作为数据源。有没有其他方法可以编写 SQL 代码以便它可以在多个位置工作?
谢谢
解决方案
LEFT JOIN
假设所有 CSV 文件共享相同的ID字段,考虑多重查询。注意:SQL 查询需要每个FROM
表和JOIN
表的括号配对。
StrSQL= "SELECT * " _
& " FROM ((samplesheet.csv t1 " _
& " LEFT JOIN [text;database=" & ThisWorkbook.Path & "].samplesheet2.csv AS t2" _
& " ON t1.ID = t2.ID)" _
& " LEFT JOIN [text;database=" & ThisWorkbook.Path & "].samplesheet3.csv AS t3" _
& " ON t1.ID = t3.ID)"
请注意,对于像这样的任何 JET/ACE 引擎查询,允许的语句数量是有限的,JOIN
这取决于数据。
对于大量 CSV 文件,请考虑遍历目录。下面将每个记录集按列复制到相邻的位置。注意:由于迭代过程,此处不使用ID连接。数据只是并排放置。
Dim objConnection As Object, objRecordSet As Object
Dim lastColumn As Long
Dim csvFile As String, StrSQL As String
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
csvFile = Dir(ThisWorkbook.Path & "\*csv")
Do While Len(csvFile) > 0
StrSQL = "SELECT * FROM [" & csvFile & "] ORDER BY ID;"
' INITIALIZE RECORDSET
Set objRecordSet = CreateObject("ADODB.Recordset")
objRecordSet.Open StrSQL, objConnection
' SAVE TO WORKSHEET
With ThisWorkbook.Worksheets("Sheet1")
lastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
.Range(.Cells(1, lastColumn), .Cells(1, lastColumn)).CopyFromRecordset objRecordSet
End With
' UNINITIALIZE RECORDSET
objRecordSet.Close
Set objRecordSet = Nothing
csvFile = Dir
Loop
objConnection.Close
Set objConnection = Nothing
推荐阅读
- puppet - Puppet 查找失败,需要一个敏感值,得到 String
- angular - Angular 7 两个组件之间的数据共享
- javascript - 当我在“选择文件”之外单击时,我的输入文件正在打开,如何仅在单击实际的“按钮”时才打开它?
- c++ - LibUV 从现有套接字创建 UDP 流
- excel - 将一系列值从一个工作簿粘贴到另一个工作簿
- google-maps - 无论如何使用api将谷歌地方的显示数量限制为2条评论
- mysql - NIFI JDBC 连接到 MariaDB UTF8 支持
- c# - RestSharp 代理 http/https/socks 信息
- bash - 如何检查是否在bash的字符串中设置了变量?
- c++ - 无法使此代码在 MSVC 2015 和 GCC 7.3 之间交叉编译