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

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

 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

Я должен читать строки между ними. Состояние остается неизменным каждый раз. Благодарю.

 David25 июн. 2012 г., 21:17
Я могу придумать пару подходов к этому. что ты уже испробовал?
 Adriano Repetti25 июн. 2012 г., 21:20
Что вы хотите сделать со строками, которые вы читаете? Чтобы сохранить их в списке без какой-либо связи с условием (= удалить строки, начинающиеся с условия)? Чтобы сгруппировать их на карте (= каждое условие является ключом, а каждая группа строк для этого условия является списком для ключа)?

Ответы на вопрос(6)

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
     }  
 26 июн. 2012 г., 04:20
Итак, создайте какой-нибудь механизм хранения данных, массив, что угодно. Ищите переменную флага, затем начинайте добавлять в хранилище, пока не нажмете следующий флаг. Код кадра есть, вам просто нужно добавить обработку.
 Sumit26 июн. 2012 г., 04:12
мне нужно хранить данные из строк между ними в какой-то временной переменной строки. все эти данные уникальны каждый раз, когда они читаются между возникшими условиями. В каком-то смысле, первое условие найдено, ищите его до следующего раза, а затем сохраняйте все промежуточные строки во временной переменной для обработки.

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

{
  string line;
  int inside = 0;
  while ((line = sr..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.
     }
  }
}

reading "every line" из StreamReader и проверьте, соответствует ли ваше «состояние» условиям; доволен. Поэтому я не понял вашего вопроса. Я хочу прочитать эти строки между ними. & Quot; !!!!

 25 июн. 2012 г., 21:50
Спасибо @Servy. Я ценю его!
 25 июн. 2012 г., 21:41
@Uday Затем вам следует просто подождать, пока у вас не будет достаточно репутации, чтобы оставлять комментарии, а не публиковать ответ, который не является ответом.
 25 июн. 2012 г., 21:32
Да, знаю!!! но по какой-то причине я не могу оставлять комментарии к другим вопросам или ответам !!
 25 июн. 2012 г., 21:25
Комментируйте, а не отвечайте ...
 25 июн. 2012 г., 21:49
Серьезно ... "-1" за запрос дополнительной информации, чтобы я мог ответить на вопрос ??? Хм, или это только потому, что я не знаю, как публиковать "комментарии" ... лол, в любом случае, я не хочу исследовать "Как публиковать комментарии в переполнении стека"; [Я проверил FAQ] ... хотя, если кто-нибудь скажет мне, как это сделать, я обязательно сделаю это. Угадайте, пока я не пойму это, я не должен публиковать ничего, кроме своих собственных вопросов :)
Решение Вопроса

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

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

Вымойте, промойте, повторите.

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

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);
    }
}
 Sumit27 июн. 2012 г., 02:04
Thx.you получил это абсолютно точно, что я хотел. Это работает для меня. Прелесть заключается в ключевом слове continue, ключевое слово continue позволяет пропустить выполнение оставшейся части итерации. Он сразу переходит к следующей итерации в цикле. Я создал массив для хранения промежуточных данных, проиндексированных с помощью счетчика, конкатенируя данные, находящиеся между ними, к этой переменной с счетчиком, инициализируемым в ноль после endtagfound. Я не смог использовать textinbetween для объединения данных каждый раз, когда они были найдены. поскольку я хочу записать данные, найденные между ними, в одну строку в новый файл.

слишком больших для 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;
       }
    }
}

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

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

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

Ваш ответ на вопрос