使用 VBA 在 csv 文件中搜索一行

Searching for a row in a csv file using VBA

我可以用什么样的函数在vba文件中搜索一行,然后将这个文件存储到一个数组中。 示例:

job,boe,sig,dive,mag,num,
blah,blah,,,,,
wuttt,ais,,sidji,,,

查找第一列中包含 "blah" 的行并将其存储到数组中。

目前我正在使用 bash nawk 命令在 csv 文件中查找该行,然后将其放入文本文件中。然后我使用:

Open "C:\file2.csv" For Binary As #1
MyData = Space$(LOF(1))
Get #1, , MyData
Close #1
strData() = Split(MyData, ",")

将行存储在数组中。为了提高效率,我想取消 bash 部分并使用 VBA.

直接从 csv 文件中读取该行

在VBA中,有两个读取文件的标准选项。

  1. 内置VBA文件访问语句和函数:打开、输入、 写入、打印、获取、放置等。咨询your favorite VBA reference 了解详情。
  2. Scripting.FileSystemObject。添加对“Microsoft Scripting 运行时”。这应该在每台 Windows PC 上可用,因为 Windows 98,因此不存在兼容性风险。

这两种方法各有利弊。内置命令支持二进制文件,但是 API 很奇怪并且基于非常旧版本的 BASIC。 FileSystemObject 有一个更现代的 API,但只支持文本文件。

使用方法 1 的示例:

Function FindEntry(file_path As String, _
                   field_index As Long, field_value As String) As Variant
    Dim file_number As Integer
    Dim raw_line As String
    Dim csv_line As Variant

    file_number = FreeFile
    Open file_path For Input As #file_number

    Do Until EOF(file_number)
        Line Input #file_number, raw_line
        csv_line = ProcessCsvData(raw_line)

        If UBound(csv_line) < field_index Then
            ' Guard against index out of bounds
        ElseIf csv_line(field_index) = field_value Then
            FindEntry = csv_line
            Exit Do
        End If
    Loop

    Close #file_number
End Function

使用方法 2 的示例:

Function FindEntry(file_path As String, _
                   field_index As Long, field_value As String) As Variant
    ' use the type Scripting.FileSystemObject if you include a reference
    ' to "Microsoft Scripting Runtime"
    Dim fs As Object
    Dim txt_file As Object
    Dim csv_line As Variant

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set txt_file = fs.OpenTextFile(file_path)

    Do Until txt_file.AtEndOfStream
        csv_line = ProcessCsvData(txt_file.ReadLine)

        If UBound(csv_line) < field_index Then
            ' Guard against index out of bounds
        ElseIf csv_line(field_index) = field_value Then
            FindEntry = csv_line
            Exit Do
        End If
    Loop

    txt_file.Close
End Function

这两种方法都使用一个名为 "ProcessCsvData" 的函数,您需要编写一个函数来将 CSV 行拆分为多个字段。这个函数的一个非常天真的实现是这样的。

' Warning: This code is wrong!
Function ProcessCsvData(csv_line As String) As Variant
    ProcessCsvData = Split(csv_line, ",")
End Function

当然,这没有考虑其中包含逗号的字段,在大多数 CSV 格式中,逗号通常通过将字段括在引号中来标记。