使用 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中,有两个读取文件的标准选项。
- 内置VBA文件访问语句和函数:打开、输入、
写入、打印、获取、放置等。咨询your favorite VBA reference
了解详情。
- 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 格式中,逗号通常通过将字段括在引号中来标记。
我可以用什么样的函数在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中,有两个读取文件的标准选项。
- 内置VBA文件访问语句和函数:打开、输入、 写入、打印、获取、放置等。咨询your favorite VBA reference 了解详情。
- 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 格式中,逗号通常通过将字段括在引号中来标记。