VBA查询CSV格式的字段内容

VBA to query field contents in CSV

我正在与 ADO 作斗争 connections/recordsets。

我的问题陈述是:一个函数将 return 所选 .csv 文件中所选字段的第一个值。

我这样做是为了在将数据添加到数据库中的相关表之前识别可变名称的 .csv 文件。我假设此字段始终存在,并且它在整个文件中保持一致,或者仅对相关字段进行分组(这是在链的上层控制并且足够确定)。

我的代码 运行 作为 MS Access 数据库模块的一部分:

Public Function GetFirstItem(File As Scripting.File, Field As String)
    
    Dim Conn As ADODB.Connection, Recordset As ADODB.Recordset, SQL As String
    Set Conn = New ADODB.Connection
    Set Recordset = New ADODB.Recordset
    
    'Microsoft.ACE.OLEDB.16.0 / Microsoft.Jet.OLEDB.4.0
    Conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=""" & File.ParentFolder & _
        """; Extended Properties=""text;HDR=Yes;FMT=Delimited;"";"
    
    SQL = "SELECT " & Field & " FROM """ & File.Name & """ LIMIT 1"
    
    Debug.Print Conn.ConnectionString
    Debug.Print SQL
    
    Conn.Open
    
    Recordset.Source = SQL
    Recordset.ActiveConnection = Conn.ConnectionString
    
    Recordset.Open
    Recordset.MoveFirst
    
    'GetFirstItem = Recordset!Questionnaire
    
    Recordset.Close
    Conn.Close
    Set Recordset = Nothing
    Set Conn = Nothing

End Function

ConnectionString = Provider=Microsoft.ACE.OLEDB.16.0;Data Source="D:\Documents\Jobs\TestPath"; Extended Properties="text;HDR=Yes;FMT=Delimited;";

字段 = Questionnaire

SQL = SELECT Questionnaire FROM "test.csv" LIMIT 1

我在 Recordset.Open 上收到错误:

这可能(很可能)是因为完全不了解 ADO connections/recordsets 的工作原理。我试过无引号,它抱怨 FROM 表达式格式错误。此外,一旦克服了这个障碍,我就不确定如何 return 我的查询结果的语法。如果有更好的方法,我会洗耳恭听!

谢谢。

在 Access 中,您不需要 ADO 库来查询 CSV 文件:

Public Function GetFirstItem(File As Scripting.File, Field As String) As String
    
    Dim RS As DAO.Recordset, SQL As String
    
    SQL = "SELECT TOP 1 [" & Field & "]" _
    & " FROM [" & File.Name & "]" _
    & " IN '" & File.ParentFolder & "'[Text;FMT=CSVDelimited;HDR=Yes];"
    
    Debug.Print SQL
    
    Set RS = CurrentDb.OpenRecordset(SQL)
    GetFirstItem = RS(0)
    RS.Close
    Set RS = Nothing
    
End Function

用法:

?GetFirstItem(CreateObject("Scripting.FileSystemObject").getfile("c:\path\to\your\file.csv"), "your field")