Как извлечь фрагмент текста из текстового файла? - PullRequest
0 голосов
/ 21 марта 2020

У меня есть файл postscript, в котором есть начальный индикатор, с которого я хочу начать копирование данных в StringBuilder, который гласит:

$$StartCopy
$$ChunkID[1234]
$$Type[Foo]
\\bla bla for hundreds or thousands of lines
$$EndCopy  

$$StartCopy
$$ChunkID[4567]
$$Type[Bar]
\\bla bla for hundreds or thousands of lines
$$EndCopy 


$$StartCopy
$$ChunkID[4567]
$$Type[Foo]
\\bla bla for hundreds or thousands of lines
$$EndCopy

$$StartCopy
$$ChunkID[8901]
$$Type[Bar]
\\bla bla for hundreds or thousands of lines
$$EndCopy 

Обратите внимание, что нет указанной строки c, которую можно запустить в, и при этом нет никакого установленного числа линий между $$ StartCopy и $$ EndCopy. В этом случае, как мне получить фрагмент текста $$Chunk[4567], где $$Type[Bar] от его начальной до конечной строки?

Чтобы было ясно, каков должен быть конечный результат:

$$StartCopy
$$ChunkID[4567]
$$Type[Bar]
\\bla bla for hundreds or thousands of lines
$$EndCopy 

1 Ответ

1 голос
/ 21 марта 2020

Поскольку вы имеете дело с большим файлом и множеством результатов, вероятно, лучше использовать File.ReadLines, который возвращает IEnumerable<string> и метод итератора

/// <summary>
/// Will return the data from a file between the start and end parameters (inclusive)
/// </summary>
/// <param name="fileName">duh</param>
/// <param name="start">The start of the sequence</param>
/// <param name="end">The end of the sequence</param>
/// <returns>Stuff</returns>
public static IEnumerable<string> GetData(string fileName, string start, string end)
{
   var found = false;
   foreach (var line in File.ReadLines(fileName))
   {
      if (line == start) found = true;

      if (!found) continue;

      yield return line;

      if (line == end) break;
   }
}

Использование

var results = GetData(fileName, "$$StartCopy", "$$EndCopy");

Примечание : Этот код полностью не проверен и не имеет каких-либо гарантийных претензий. или возвращается из-за людей, которым вы можете навредить или иным образом нанести вред с помощью этого кода

Отличный комментарий от Dai

Проблема со NET встроенными ReadLine / ReadLineAsync / ReadLines методами заключается в том, что они используют строку Environment.NewLine и не позволяют вручную указать line-terminator , что делает их бесполезными для написания кросс-платформенного кода

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

Строка, содержащая "\ r \ n" для не Unix платформ, или строка, содержащая "\ n" для Unix платформ.

...