Как бы я обнаружил два последних появления символов/наборов данных в текстовом файле С#

У меня есть эти текстовые файлы как структурированные:

value1 value2 value3          
Table1 Table2 Table3
(data set values here)
.
.
.(represent text in between)
.
value1 value2 value3
Table1 Table2 Table3            
(data set values here)          

и

value1 value2 value3          
Table1 Table2 Table3
(data set values here)
.
.
.(represent text in between)
.
value1 value2 value3
Table1 Table2 Table3            
(data set values here)
.
.
. 
value1 value2 value3
Table1 Table2 Table3            
(data set values here)

Поскольку они здесь, они структурированы по-разному: у некоторых есть два набора таблиц, у некоторых - три, а у других - 4. Однако все они имеют общую характеристику, заключающуюся в том, что все они имеют одинаковое форматирование структуры таблицы:

value1 value2 value3
Table1 Table2 Table3            
(data set values here)   

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

Что у меня есть до сих пор:

string[] lines = File.ReadAllLines("myTextfile.txt"); //stores text file in array
foreach(var item in lines)
{
    Console.WriteLine(item.ToString()); //foreach loop here prints out code to console, line by line

}

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

ИЗМЕНИТЬ

Ввод образцов текстовых файлов:

Time: 5:30am         
EndTime: 5:30pm.
.
.(represent text in between)
.
Time: 7:30am         
EndTime: 8:30pm           

Time: 6:30am         
EndTime: 1:30pm 
.
.
.(represent text in between)
.
Time: 8:30am         
EndTime: 9:30pm
.
.
. 
Time: 3:30am         
EndTime: 4:30pm

Я хочу иметь возможность обнаруживать последнее вхождение Time и EndTime, поэтому при запуске программы она вернется:

//for the first one 
Time: 7:30am         
EndTime: 8:30pm 
//for the second one 
Time: 3:30am         
EndTime: 4:30pm

person thesenate42069    schedule 12.06.2020    source источник
comment
Общность вашего вопроса затрудняет понимание, не могли бы вы привести 2 разных примера входных файлов и ожидаемого/запрошенного вывода?   -  person Lasse V. Karlsen    schedule 12.06.2020
comment
Вопрос: Что, если первый файл содержит одну строку в начале с Time: 5:30am, затем . . (represent text in between) . . , а затем EndTime: 8:30pm, вам нужна строка Time + строка EndTime? Я хочу спросить, всегда ли будет пара строк Time/EndTime вместе, или вы действительно хотите, чтобы за последним Time следовал последний EndTime?   -  person Lasse V. Karlsen    schedule 12.06.2020
comment
На ваш вопрос можно было бы ответить просто var time = ""; var endTime = ""; foreach (string line in File.ReadAllLines("filename.text")) { if (line.StartsWith("Time:")) time = line; else if (line.StartsWith("EndTime:")) endTime = line; } Console.WriteLine(time); Console.WriteLine(endTime);, пожалуйста, скажите мне, что не так с этим решением, и тогда мы что-то получим.   -  person Lasse V. Karlsen    schedule 12.06.2020
comment
Я понимаю, что вы имеете в виду, я думаю, что я имею в виду, что я хочу, чтобы последнее время, а затем последнее время окончания, так как я хочу, чтобы они были в двух отдельных случаях.   -  person thesenate42069    schedule 12.06.2020
comment
О, я вижу, он перебирает все переменные Time, EndTime, а затем, когда он достигает конца, он устанавливает эти значения.   -  person thesenate42069    schedule 12.06.2020
comment
Действительно ли код в моем комментарии выше производит то, что вы хотите?   -  person Lasse V. Karlsen    schedule 12.06.2020
comment
Да, это работает, я просто немного поиграл с этим, спасибо!   -  person thesenate42069    schedule 12.06.2020


Ответы (2)


Самый простой способ сделать следующее:

  • Соберите последнее вхождение строки, начинающейся с "Время:"
  • Соберите последнее вхождение строки, начинающейся с "EndLine:"
  • Выведите два как «Time: xxx», а затем «EndTime: xxx» с этими двумя строками.

будет что-то вроде этого:

string time = "";
string endTime = "";
foreach (string line in File.ReadLines("filename.txt")) // or any source of strings
    if (line.StartsWith("Time:"))
        time = line;
    else if (line.StartsWith("EndTime:"))
        endTime = line;
// error handling would go here, like what if time is still empty? or endTime?
Console.WriteLine(time);
Console.WriteLine(endTime);
person Lasse V. Karlsen    schedule 12.06.2020

Я бы построил конец чтения вопроса/ответа файла на ТАК. Таким образом, вы можете прочитать небольшой буфер строк, чтобы получить конечные. Что-то вроде этого:

    static async Task Main(string[] args)
    {
        using (var reader = new StreamReader("foo.txt"))
        {
            var (start, end) = DecomposeLastTwoTimeLines(reader);

            Console.WriteLine($"Start: {start}");
            Console.WriteLine($"End: {end}");
        }
    }

    static ValueTuple<string, string> DecomposeLastTwoTimeLines(StreamReader reader)
    {
        long TimeLinesLength = ("EndTime: 12:30pm".Length * 2 * 2) + 2;

        if (reader.BaseStream.Length > TimeLinesLength)
        {
            reader.BaseStream.Seek(-TimeLinesLength, SeekOrigin.End);
        }

        List<string> lines = new List<string>();

        string line;
        while ((line = reader.ReadLine()) != null)
            lines.Add(line);

        if (lines.Count < 2)
            throw new FileFormatException();

        return (lines[^2], lines[^1]);
    }
person MikeJ    schedule 12.06.2020