Блок чтения текстового файла


У меня есть текстовый файл, в котором определенный символ повторяется в начале строки через каждые несколько строк. отсутствие. линий между ними не зафиксировано. Я могу найти те линии, где происходит это состояние. Я хочу прочитать эти строки между ними.

 using (StreamReader sr = new StreamReader(@"text file"))
 {
     string line;
     while ((line = sr.ReadLine()) != null)
     {
         if (line.StartsWith("some character"))

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

Например.

Condition at the begining of a line
Next line
Next line
Condition at the begining of a line
Next Line
Next Line
Next Line
Next Line
Condition at the begining of a line

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

6   2  

6 ответов:

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

В основном Вы читаете каждую строку, проверяете первое условие, которое сигнализирует о начале" блока", и продолжаете читать строки, пока не найдете другое условие, которое сигнализирует о конце блока (и начале другого).

Промыть, прополоскать, повторить.

Простой пример:

using (var reader = new StreamReader(@"test.txt"))
{
    var textInBetween = new List<string>();

    bool startTagFound = false;

    while (!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        if (String.IsNullOrEmpty(line))
            continue;

        if (!startTagFound)
        {
            startTagFound = line.StartsWith("Condition");
            continue;
        }

        bool endTagFound = line.StartsWith("Condition");
        if (endTagFound)
        {
            // Do stuff with the text you've read in between here
            // ...

            textInBetween.Clear();
            continue;
        }

        textInBetween.Add(line);
    }
}

Похоже, вам нужно только пропустить строки, которые отвечают определенному условию.

var lines = System.IO.File.ReadLines(@"text file")
            .Where (line => ! line.StartsWith("Condition");

foreach(string line in lines)
{
  // do your stuff
}

Если я понял правильно, вы хотите переключаться между условием "внутри или снаружи блока":

{
  string line;
  int inside = 0;
  while ((line = sr.ReadLine()) != null)
  {
     if (line.StartsWith("some character"))
     {
         inside = !inside;
         // If you want to process the control line, do it here.
         continue;
     }
     if (inside)
     {
         // "line" is inside the block. The line starting with "some character"
         // is never here.
     }
     else
     {
         // Well, line is outside. And the control lines aren't here either.
     }
  }
}

Этот метод я использую довольно часто для чтения в xml-файлах, слишком больших для XDocument. Было бы довольно легко изменить его для ваших нужд.

public static void ReadThroghFile(string filePath, int beingLinesToSkip, string endingMarker, Action<string> action)
{
   using (var feed = new StreamReader(filePath))
   {
       var currentLine = String.Empty;
       var ongoingStringFromFeed = String.Empty;

       for (var i = 0; i < beingLinesToSkip; i++) feed.ReadLine(); 

       while ((currentLine = feed.ReadLine()) != null)
       {
           ongoingStringFromFeed += currentLine.Trim();
           if (!currentLine.Contains(endingMarker)) continue;

           action(ongoingStringFromFeed);
           ongoingStringFromFeed = String.Empty;
       }
    }
}

Если только я чего-то не упускаю, то, похоже, что и ты тоже. чтение "каждой строчки" из StreamReader и проверяет, удовлетворено ли ваше "условие". Поэтому я не понял вашего вопроса "я хочу прочитать эти строки между ними. "!!!!

Не могли бы вы просто еще раз сделать то, что вы хотите?

using (StreamReader sr = new StreamReader(@"text file"))
{
 string line;
 while ((line = sr.ReadLine()) != null)
 {
     if (line.StartsWith("some character"))
     {
        //Get rid of line
     }
     else
     {
       // Do stuff with the lines you want
     }