ADO文本驱动程序修剪领先空间

时间:2010-12-20 16:52:32

标签: vba adodb text-parsing

我正在使用带有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方法

1 个答案:

答案 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文件指定固定宽度的文件格式:

http://support.microsoft.com/kb/187670

http://office.microsoft.com/en-us/access-help/initializing-the-text-data-source-driver-HP001032166.aspx