Как изменить файл построчно - PullRequest
0 голосов
/ 09 июля 2019

У меня есть текстовый файл в этом синтаксисе:

'foo','bar'
'foo','foo bar'
'foo','foo
bar bar'
'bar', 'foo'

Я хочу найти каждую строку, которая не начинается с ', и исправить их.Я хочу закончить:

'foo','bar'
'foo','foo bar'
'foo','foo bar bar'
'bar', 'foo'

Новая строка должна быть удалена и добавлена ​​в конец предыдущей строки с пробелом.Мой код просматривает файл строка за строкой и проверяет, не совпадает ли уже первый символ с '.

Я думал о добавлении каждой строки в массив и внесении исправлений в этот массив.Я бы использовал

Open myFile For Output As #1
Write #1, lineOfArray
Close #1

для обновления файла.

Мой текущий код:

Sub Update_File(fileToUpdate As String, fileSys As Variant)

    Set File = fileSys.OpenTextFile(fileToUpdate)
    Do Until File.AtEndOfStream
        currentLine = File.ReadLine

        If Left(currentFile, 1) <> "'" Then
            'Magic here
        End If
    Loop
    File.Close

End Sub

Я борюсь с тем, что является наилучшей практикой, а что является худым ибыстрый код, потому что скрипт должен запускать более 1000 файлов в конце.Я не знаю, возможно ли сохранить текущую и следующую строку, и если следующая строка не начинается с ', затем currentLine = currentLine & " " & nextLine и каким-то образом обновить файл, уменьшить значение цикла на единицу и продолжить.

Ответы [ 3 ]

1 голос
/ 09 июля 2019

Основываясь на прекрасном коде TinMan, попробуйте этот всерион

Sub Test_UpdateFile()
UpdateFile ThisWorkbook.Path & "\Sample.txt", CreateObject("Scripting.FileSystemObject")
End Sub

Sub UpdateFile(ByVal filePath As String, ByRef fso As Object)
Const forReading = 1

Dim lines()     As String
Dim dirty       As Boolean
Dim r           As Long
Dim x           As Long
Dim k           As Long

With fso.OpenTextFile(filePath, forReading)
    lines = Split(.ReadAll, vbNewLine)
    .Close
End With

For r = 1 To UBound(lines)
    If Left(lines(r), 1) <> "'" Then
        lines(r - 1) = lines(r - 1) & " " & lines(r)
        lines(r) = Empty
        dirty = True
        x = x + 1
    End If
Next r

If dirty Then
    ReDim nLines(0 To UBound(lines) - x + 1)

    For r = 0 To UBound(lines)
        If lines(r) <> Empty Then
            nLines(k) = lines(r)
            k = k + 1
        End If
    Next r


    With fso.CreateTextFile(filePath, True)
        .Write Join(nLines, vbNewLine)
        .Close
    End With
End If
End Sub
1 голос
/ 09 июля 2019

Вот как бы я это сделал.

Sub Update_File(ByVal FilePath As String, ByRef fso As Object)
    Const ForReading = 1

    Dim lines() As String
    Dim r As Long
    Dim Dirty As Boolean

    With fso.OpenTextFile(FilePath, ForReading)
        lines = Split(.ReadAll, vbNewLine)
        .Close
    End With

    For r = 0 To UBound(lines)
        If Left(lines(r), 1) <> "'" Then
            lines(r) = "'" & lines(r)
            Dirty = True
        End If
    Next

    If Dirty Then
        With fso.CreateTextFile(FilePath, True)
            .Write Join(lines, vbNewLine)
            .Close
        End With
    End If

End Sub
0 голосов
/ 09 июля 2019

Что по этому поводу:

currentline = File.ReadLine
NextLine = vbNullString
Do 
    If Not File.AtEndOfStream Then
        NextLine = File.ReadLine

        Do While Left$(NextLine, 1) <> "'"
            If Len(currentline) > 0 Then currentline = Trim(currentline) & " "
            currentline = currentline & Trim(NextLine)
            NextLine = File.ReadLine
        Loop
    End If

    Write #1, currentline
    currentline = NextLine

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