Блок чтения текстового файла
У меня есть текстовый файл, в котором определенный символ повторяется в начале строки через каждые несколько строк. отсутствие. линий между ними не зафиксировано. Я могу найти те линии, где происходит это состояние. Я хочу прочитать эти строки между ними.
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 ответов:
Я предполагаю, что вы хотите анализировать текстовый файл и обрабатывать все блоки текста между условиями каждый раз.
В основном Вы читаете каждую строку, проверяете первое условие, которое сигнализирует о начале" блока", и продолжаете читать строки, пока не найдете другое условие, которое сигнализирует о конце блока (и начале другого).Промыть, прополоскать, повторить.
Простой пример:
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; } } }