我正在使用带有Microsoft文本驱动程序的ADODB来解析Excel中的文本文件。
问题是该文件的某些行有一个前导空格,这个领先的空间正在被砍掉。
当我在记录集上执行GetString(,1)时,如下所示: “描述不要使用”
被修剪为:
“描述不要使用”
...这是有问题的,因为我实际上正在解析思科配置文件,并且领先的空间对于确定我是否仍然在同一个对象中非常有用。
例如文字如:
object-group network ABC_Group
network-object host 192.10.24.71
network-object host 192.10.24.72
network-object host 192.10.24.20
network-object host 192.10.24.21
object-group network XYZ_hosts
network-object host 192.10.24.55
network-object host 192.10.24.26
...我正在使用领先空间告诉我,我仍然在同一个对象组中。
关于如何在读取文本文件时让ADODB保持领先空间的任何想法?
我最初尝试使用FileStreamObject,但发现我正在阅读的文件有一些以Chr(13)结尾的行,有些以Chr(13)和Chr(10)结束,这就是抛弃了Readline方法
答案 0 :(得分:2)
抱歉,这个答案的早期版本使用了C#。对于VBA,你必须做一些更重的提升。
如果文件足够小以适合内存,你可以用字符串读取整个文件,然后拆分它:
Private Function SplitFileContents(ByVal fileContents As String) As String()
Dim arrResult() As String
Dim resultCount As Long
Dim crPos As Long
Dim lfPos As Long
dim endPos As Long
Do While Len(fileContents) > 0
crPos = InStr(fileContents, vbCr)
lfPos = InStr(fileContents, vbLf)
If crPos = 0 And lfPos = 0 Then
ReDim Preserve arrResult(0 To resultCount)
arrResult(resultCount) = fileContents
resultCount = resultCount + 1
Exit Do
ElseIf crPos = 0 Then
endPos = lfPos
ElseIf lfPos = 0 Then
endPos = crPos
ElseIf crPos < lfPos Then
endPos = crPos
Else
endPos = lfPos
End If
If endPos > 1 Then
ReDim Preserve arrResult(0 To resultCount)
arrResult(resultCount) = Left$(fileContents, endPos - 1)
resultCount = resultCount + 1
End If
If endPos = Len(fileContents) Then
fileContents = ""
Else
fileContents = Mid$(fileContents, endPos + 1)
End If
Loop
If resultCount = 0 Then
ReDim arrResult(0 to 0)
arrResult(0) = ""
End If
SplitFileContents = arrResult
End Function
或者,有几种可能的方法使用固定宽度格式,这将保留前导空格。这些文章讨论使用schema.ini文件指定固定宽度的文件格式: