Выделите блок текста и объедините в новый документ - PullRequest
0 голосов
/ 23 октября 2019

Привет, я посмотрел онлайн и просто не могу найти правильный ответ. У меня есть файлы, в которых есть <!--#start#--> и <!--#stop#-->.
Я хочу только содержимое между этими двумя строками. Код, который я имею, все еще распечатывает все данные, включая строки начала / остановки.

Dim Prefix As String
Dim newMasterFilePath As String
Dim masterFileName As String
Dim newMasterFileName As String
Dim startMark As String = "<!--#start#-->"
Dim stopMark As String = "<!--#stop#-->"
'values from GUI form
searchDir = txtDirectory.Text
Prefix = txtBxUnique.Text


For Each singleFile In allFiles
    If File.Exists(singleFile.FullName) Then
        Dim fileName = singleFile.FullName
        Debug.Print("file name : " & fileName)
        ' A backup first    
        Dim backup As String = fileName & ".bak"
        File.Copy(fileName, backup, True)

        ' Load lines from the source file in memory
        Dim lines() As String = File.ReadAllLines(backup)

        ' Now re-create the source file and start writing lines inside a block
        ' Evaluate all the lines in the file.
        ' Set insideBlock to false
        Dim insideBlock As Boolean = False
        Using sw As StreamWriter = File.CreateText(backup)
            For Each line As String In lines
                If line = startMark Then
                    ' start writing at the line below
                    insideBlock = True
                    ' Evaluate if the next line is <!Stop>
                ElseIf line = stopMark Then
                    ' Stop writing
                    insideBlock = False
                ElseIf insideBlock = True Then
                    ' Write the current line in the block
                    sw.WriteLine(line)
                End If
            Next
        End Using
    End If
Next

Здесь, в другой части моего кода, я извлекаю имя сущности из основного документа и заменяю его текстом между началом и окончанием

Dim strMasterDoc = File.ReadAllText(existingMasterFilePath)
Dim newMasterFileBuilder As New StringBuilder(strMasterDoc)

'Create a regex with a named capture group.
Dim rx = New Regex("&" & Prefix & "_Ch(?<EntityNumber>\d+(?:-\d+)*)[;]")
Dim reg1 As String
reg1 = rx.ToString
Debug.Write("Chapter Entity: " & reg1)
Dim rxMatches = rx.Matches(strMasterDoc)

For Each match As Match In rxMatches
    Dim entity = match.ToString
    'Build the file name using the captured digits from the entity in the master file
    Dim entityFileName = Prefix & $"_Ch{match.Groups("EntityNumber")}.sgm"
    Dim entityFilePath = Path.Combine(searchDir, entityFileName)
    'Check if the entity file exists and use its contents
    'to replace the entity in the copy of the master file
    'contained in the StringBuilder
    If File.Exists(entityFilePath) Then
        Dim entityFileContents As String =   File.ReadAllText(entityFilePath)
        newMasterFileBuilder.Replace(entity, entityFileContents)
    End If
Next

'write the processed contents of the master file to a different file
File.WriteAllText(newMasterFilePath, newMasterFileBuilder.ToString)

1 Ответ

0 голосов
/ 24 октября 2019

Как уже упоминалось в моем комментарии, я думаю, что проблема может заключаться в том, что строки в строках () содержат символы возврата каретки и перевода строки. Вы пытались использовать line.Contains(startMark) вместо проверки на равенство?

Также;Есть ли какая-то конкретная причина, по которой вы читаете все строки и сохраняете их в первую очередь, прежде чем просматривать их, чтобы проверить их? Я думаю, что было бы более эффективно читать, проверять и писать за один раз:

Using SR As New StreamReader(YourFilePath)
   Using sw As New StreamWriter(OtherFilePath)
       Do Until SR.EndOfStream
            line = SR.ReadLine()
            If line.contains(startMark) Then
                  ' start writing at the line below
                  insideBlock = True

                  ' Evaluate if the next line is <!Stop>
            ElseIf line.Contains(stopMark) Then
                  ' Stop writing
                  insideBlock = False

            ElseIf insideBlock = True Then
                  ' Write the current line in the block
                  sw.WriteLine(line)
            End If
        Loop
    End Using
End Using
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...