【发布时间】:2020-02-07 04:31:31
【问题描述】:
我正在从网络驱动器导入 CSV,该驱动器有很多包含文本 SG_ 的列。我目前正在通过代码重命名这些列,方法是运行第一个查询以创建具有SELECT TOP 1* FROM FILENAME.EXT 行的记录集。然后我循环recordset.Fields 并删除前缀文本,例如nnn_ 使用 MID Function 并使用剩余的文本将它们用作 Aliases 用于这些 SG 列。所以我的第一个 VBA 创建的 SQL 字符串如下所示:
StrSQL = "SELECT [Food],[Bev],[Meds],[Average 1],[Midpoint],[Average 2],[SG_ABC],[SG_DEF],[SG_GHI]
由此,我想选择包含SG_ 的列。
示例 VBA 代码:
Set oCon = CreateObject("ADODB.Connection")
Set oRs = CreateObject("ADODB.Recordset")
strCon = "Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=" & sFullDirectory & ";Extensions=asc,csv,tab,txt;HDR=Yes;"
strSQL = "SELECT TOP 1 * FROM " & FILE1
oCon.Open strCon
Set oRs = oCon.Execute(strSQL)
i = 1
strSQL = "SELECT "
For Each Fld In oRs.Fields
Select Case True
Case Is = InStr(1, Fld.Name,"SG_") > 0
TempSG=Trim(Mid(Fld.Name,InStr(1,Fld.Name,"SG_"),Len(Fld.Name)))
strSQL = strSQL & " CDbl([" & Fld.Name & "]) AS [" & TempSG & "], "
....more Cases...
End Select
Next Fld
oRs.Close
....more code.
然后我将此strSQL 查询加入其他表,以选择其他列并将结果加载到 ado 记录集。我目前正在使用 VBA 在 Excel 中使用 Microsoft Access 文本驱动程序。
strSQL1 = "SELECT G.[lbl], A.[tval], Q.*"
strSQL1 = strSQL1 & " FROM "
strSQL1 = strSQL1 & " (SELECT G.[pos], A.[pos], G.[lbl], A.[tval] FROM " & FILE2 & " G," & FILE3 & " A WHERE G.[ID] = A.[ID]) T, (" & strSQL & ") Q "
strSQL1 = strSQL1 & " WHERE (CLng(T.[G].[pos]) = CLng(Q.[gval])) AND (CLng(T.[A].[pos]) = CLng(Q.[pos]))"
strSQL1 = strSQL1 & " ORDER BY CLng(Q.[gval]), CDbl(Q.[Aggregate 1]) DESC, G.[lbl];"
Set oRs = oCon.Execute(strSQL1)
在上面的代码中,Q.* 代表下表,我只想从中选择 SG_ 列。希望这能让事情变得清楚。例如
SELECT G.[lbl], A.[tval], Q.* LIKE 'SG_'
CSV 表格:
Food | Bev | Meds | Average | Midpoint | Average | 434_SG_ABC | 236_SG_DEF | 121_SG_GHI |
--------------------------------------------------------------------------------------------------
cheese | Rum | cold | 1.22 | 4.98 | 0.24 | 23.43 | 54.67 | 89.33 |
Butter | Wine | heat | 3.56 | 2.40 | 0.98 | 12.12 | 90.23 | 33.43 |
Olive | Beer | rain | 4.33 | 7.11 | 1.45 | 11.55 | 10.31 | 87.22 |
Rice | Gin | hail | 2.02 | 7.86 | 3.36 | 25.82 | 29.44 | 65.70 |
有没有办法选择这些列?
【问题讨论】:
-
构建动态查询需要多少列?数百?
-
@Parfait 这取决于客户的预测。大多数 csv 可能在列中显示 30-40 个 SGroup。但有些可能只有 5 个。所以它每次都会变化。
-
您需要将 CSV 清理为您需要的格式,然后使用依赖结构化数据的 SQL 进行处理。
标签: sql excel vba odbc sql-like