Объединение строк из текстового файла - Excel VBA

У меня есть текстовый файл в таком формате,

Текст:

-- Begin 
  Line1
  Line2
  Line3
      ^
-- Begin
  Line1
  Line2
  Line3
  Line4
      ^
.
.
.
.

Я в основном хочу поместить от Line1 до Line(whatever) между строками от --Begin до ^ в массиве, чтобы каждый элемент в массиве был набором строк Пример массива

Array =  [("Line1"  & vbNewLine & "Line 2") , ("Line1"  & vbNewLine & "Line 2" & vbNewLine & "Line 3") ... ]

Но в основном нужно хранить каждый элемент массива в ячейке. (Возможно, даже не нужно использовать массив)...

Не уверен, что это возможно даже в Excel VBA, но это то, что я пробовал до сих пор.

    Dim FileNum As Integer
    Dim DataLine As String
    Dim Lines As Variant
    Dim j As Integer


    FileNum = FreeFile()
    Open "C:..." For Input As #FileNum


 While Not EOF(FileNum)
       Line Input #FileNum, DataLine

      If InStr(DataLine, "-- Begin") > 0 Then
        nextLinecounter = 1

      ElseIf InStr(DataLine, "^") > 0 Then
        nextLinecounter = 0
        j = j + 1

      ElseIf nextLinecounter = 1 Then
       Lines(j) = DataLine + .. Somehow concatenate next lines into array

     End If


Wend

Я застрял, как пропустить следующую строку и добавить ее к текущей записи, спасибо за любой способ сделать это.


person Thatdude1    schedule 22.10.2013    source источник
comment
@mehow Как бы я использовал readAll и установил границы, где начинать и заканчивать читать все?   -  person Thatdude1    schedule 22.10.2013


Ответы (1)


Так что я бы сделал это немного по-другому. Использование более современного подхода к чтению файлов.

Подробнее о том, как читать файлы *.txt в VBA, см. here

Примечание: вам нужно добавить ссылки на Microsoft Scripting Runtime через VBE -> Инструменты -> Ссылки

Option Explicit

Sub ReadTxtFile()

    Dim oFSO As New FileSystemObject
    Dim oFS As TextStream

    Dim filePath As String
    filePath = "C:\Users\" & Environ$("username") & "\Desktop\foo.txt"

    If Not fileExist(filePath) Then GoTo FileDoesntExist

    On Error GoTo Err

    ReDim arr(0) As String
    Dim s As String

    Set oFS = oFSO.OpenTextFile(filePath)
    Do While Not oFS.AtEndOfStream
        Dim line As String
        line = oFS.ReadLine
        If InStr(line, "-- Begin") = 0 And InStr(line, "^") = 0 Then
            s = s & line
        End If
        If InStr(line, "^") > 0 Then
            arr(UBound(arr)) = s
            ReDim Preserve arr(UBound(arr) + 1)
            s = vbNullString
        End If
    Loop
    ReDim Preserve arr(UBound(arr) - 1)
    oFS.Close

    Dim k As Long
    For k = LBound(arr) To UBound(arr)
        Debug.Print k, arr(k)
    Next k
    Exit Sub

FileDoesntExist:
    MsgBox "File Doesn't Exist", vbCritical, "File not found!"
    Exit Sub

Err:
    MsgBox "Error while reading the file.", vbCritical, vbNullString
    oFS.Close
    Exit Sub

End Sub


Function fileExist(path As String) As Boolean
    fileExist = IIf(Dir(path) <> vbNullString, True, False)
End Function

foo.txt выглядит так

-- Begin 
  Line1
  Line2
  Line3
      ^
-- Begin
  Line1
  Line2
  Line3
  Line4
      ^

ваш массив выглядит так

введите здесь описание изображения

person Community    schedule 22.10.2013
comment
для этого у arr нет одной строки в качестве каждого элемента. Есть ли способ сохранить несколько строк в каждом элементе? - person Thatdude1; 22.10.2013
comment
Если я читаю это сразу после каждого такого количества элементов, существует элемент с несколькими строками... Итак, в вашем .txt файле arr(4) = Line1 Line2 Line3? - person Thatdude1; 22.10.2013
comment
и я не думаю, что это работает .. arr(UBound(arr)) & vbNewLine .. добавляет все строки до или? - person Thatdude1; 22.10.2013
comment
Я изменил код, чтобы он вставлял каждый блок txt в отдельный индекс. это то, чего ты хочешь? - person ; 22.10.2013
comment
@ Thatdude1, что ты имеешь в виду i dont think this works? что у вас не работает? - person ; 22.10.2013
comment
Большое спасибо за то, что уделили мне время, как у меня это тоже работает, и да, это то, что я хотел ... Ура! - person Thatdude1; 22.10.2013
comment
уф.. Я серьезно начал беспокоиться :P хорошо, я рад, что это работает - person ; 22.10.2013