Выберите текст между ключевыми словами - PullRequest
0 голосов
/ 25 октября 2019

Это продолжение вопроса Выберите блок текста и объедините его с новым документом

У меня есть документ SGM с добавленными комментариями и комментариями в моем файле sgm. Мне нужно извлечь строки между комментариями start / stop, чтобы я мог поместить их во временный файл для модификации. Прямо сейчас он выбирает все, включая старт / стоп комментарии и данные за пределами старт / стоп комментариев.

Dim DirFolder As String = txtDirectory.Text
Dim Directory As New IO.DirectoryInfo(DirFolder)
Dim allFiles As IO.FileInfo() = Directory.GetFiles("*.sgm")
Dim singleFile As IO.FileInfo
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#-->"
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

Это пример текста для тестирования.

<chapter id="Chapter_Overview"> <?Pub Lcl _divid="500" _parentid="0"> 
<title>Learning how to gather data</title>
<!--#start#-->
<section>
<title>ALTERNATE MISSION EQUIPMENT</title>
<para0 verdate="18 Jan 2019" verstatus="ver">
<title>
<applicabil applicref="xxx">
</applicabil>Three-Button Trackball Mouse</title>
<para>This is the example to grab all text between start and stop comments. 
</para></para0>
</section>
<!--#stop#-->

примечание: комментарии начала и окончания ВСЕГДА попадают на новую строку, документ может иметь несколько разделов начала / остановки

Я подумал, может быть, использовать регулярное выражение для этого

(<section>[\w+\w]+.*?<\/section>)\R(<\?Pub _gtinsert.*>\R<pgbrk pgnum.*?>\R<\?Pub /_gtinsert>)*

Или, возможно, использовать IndexOfи LastIndexOf, но я не смог заставить это работать.

1 Ответ

1 голос
/ 25 октября 2019

Вы можете прочитать весь файл и разбить его на массив, используя массив строк {"<!--#start#-->", "<!--#stop#-->"} для разделения, на этот

  • Элемент 0: Текст перед "<!--#start#-->"
  • Элемент 1: текст между "<!--#start#-->" и "<!--#stop#-->"
  • Элемент 2: текст после "<!--#stop#-->"

и получение элемента 1. Затем запишите его в резервную копию.

Dim text = File.ReadAllText(backup).Split({startMark, stopMark}, StringSplitOptions.RemoveEmptyEntries)(1)
Using sw As StreamWriter = File.CreateText(backup)
    sw.Write(text)
End Using

Изменить на адрес комментария

Я сделал оригинальный код немного компактным. Это может быть расширено до следующего, что позволяет добавить некоторую проверку

Dim text = File.ReadAllText(backup)
Dim split = text.Split({startMark, stopMark}, StringSplitOptions.RemoveEmptyEntries)
If split.Count() <> 3 Then Throw New Exception("File didn't contain one or more delimiters.")
text = split(1)
Using sw As StreamWriter = File.CreateText(backup)
    sw.Write(text)
End Using
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...