ADO Text Driver Обрезка ведущего пространства - PullRequest
0 голосов
/ 20 декабря 2010

Я использую ADODB с драйвером текста Microsoft для анализа текстового файла в Excel.

Проблема заключается в том, что некоторые строки файла имеют начальный пробел, и этот начальный пробел прерывается.

Когда я выполняю функцию GetString (, 1) для моего набора записей, строка типа: «описание НЕ ИСПОЛЬЗУЕТ»

обрезается до:

«описание НЕ ИСПОЛЬЗУЕТСЯ»

... это проблематично, потому что я на самом деле анализирую файл конфигурации Cisco, а начальное пространство полезно для выяснения, если я все еще в том же объекте или нет.

Например, с текстом вроде:

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), который сбрасывал с меняThOD.

1 Ответ

2 голосов
/ 20 декабря 2010

Извините, более ранняя версия этого ответа использовала 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...