Member 14595881 Ответов: 1

Получение данных между двумя элементами


Привет, я посмотрел в интернете и просто не могу найти правильный ответ. У меня есть файлы, которые имеют и через них. Мне нужно только содержимое между этими двумя строками. Код, который у меня есть, все еще распечатывает все данные, включая строки запуска/остановки. Спасибо за вашу помощь. Максин
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


Здесь в другой части моего кода я беру имя сущности из основного документа и заменяю его текстом между start и stop
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)


Что я уже пробовал:

Я пробовал использовать StreamWriter для поиска документов и сбора данных

1 Ответов

Рейтинг:
2

Luc Pattyn

Я просмотрел только первую часть вашего вопроса.
Ваш код кажется правильным, однако есть что-то странное: сначала вы создаете резервную копию, а затем создаете StreamWriter, который записывает в тот же файл. Зачем тогда делать резервную копию? Поэтому я предполагаю, что вы имели в виду что-то другое, код работает нормально, вы просто смотрите не на тот файл и ошибочно решаете, что ничего не произошло.

Скорее всего, эта путаница также объясняет то, что вы считаете неправильным во второй половине вашей проблемы.

:)


Member 14595881

Пример, который я использовал, имел резервную копию каждого файла. Код должен был манипулировать данными в резервной копии, чтобы вы случайно не испортили источник. Но код не верен. Файл, который он создает, - это беспорядок. Оно имеет

Luc Pattyn

Я запустил ваш первый блок кода (для одного файла, без цикла allFiles), и он сработал.
Я установил filename="abc.txt-который содержал какой-то текст и ваши метки.;
и я нашел урезанный результат в "abc.txt.bak"

Называть что-то резервной копией, а затем намеренно изменять его не имеет смысла, но это работает.

Member 14595881

программа копирует данные, которые не находятся между двумя элементами, она выбирает все, включая комментарии start/stop

Luc Pattyn

Улучшите управляемость вашего кода и запустите его только для 1 файла.

Шаг 1 Убедитесь, что вы получаете строки, как ожидалось (в отличие от всех в 1 строке, например):

Dim lines() As String = File.ReadAllLines(backup)
MessageBox.Show("read " & lines.Length & " lines")      ' Add this line


Шаг 2

Добавьте счетчики, подсчитывающие количество распознанных запусков, распознанных остановок и скопированных строк; и отобразите их, когда закончите генерировать выходной файл.