Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading lines after specific string in a text file then storing data in lists

I have a program that reads texts files and I'm wanting it to collect data after a certain title in the text file, in this case [HRData]. Once the streamreader reaches [HRData] I want it to read every line after that and store each line in a list, but allowing me to get access to the seperate numbers.

The text file is like so:

[HRZones]
190
175
162
152
143
133
0
0
0
0
0

[SwapTimes]

[Trip]
250
0
3978
309
313
229
504
651
//n header 
[HRData]
91  154 70  309 83  6451
91  154 70  309 83  6451
92  160 75  309 87  5687
94  173 80  309 87  5687
96  187 87  309 95  4662
100 190 93  309 123 4407
101 192 97  309 141 4915
103 191 98  309 145 5429

So referring to the text file, I want it to store the first line after [HRData] and allow me access each variable, for example 91 being [0].

I have code that already stores to a list if the word matches the regex, but I do not know how to code it to read after a specific string like [HRData].

if (squareBrackets.Match(line).Success) {
 titles.Add(line);
 if (textAfterTitles.Match(line).Success) {
  textaftertitles.Add(line);

 }
}

This is my attempt so far:

if (line.Contains("[HRData]")) {
 inttimes = true;
 MessageBox.Show("HRDATA Found");
 if (inttimes == true) {
  while (null != (line = streamReader.ReadLine())) {
   //ADD LINE AND BREAK UP INTO PARTS S
  }
 }
}
like image 231
Matt Murphy Avatar asked Dec 16 '25 14:12

Matt Murphy


1 Answers

You can call a LINQ-friendly method File.ReadLines , then you can use LINQ to get the part you want:

List<string> numbers = File.ReadLines("data.txt")
                           .SkipWhile(line => line != "[HRData]") 
                           .Skip(1)
                           .SelectMany(line => line.Split())
                           .ToList();

Console.WriteLine(numbers[0]); // 91

Edit - this will give you all the numbers in one List<string>, if you want to keep the line order, use Select instead of SelectMany:

List<List<string>> listsOfNums = File.ReadLines("data.txt")
                                     .SkipWhile(line => line != "[HRData]") 
                                     .Skip(1)
                                     .Select(line => line.Split().ToList())
                                     .ToList();

Note that this requires additional index to get a single number:

Console.WriteLine(listsOfNums[0][0]); // 91
like image 103
w.b Avatar answered Dec 19 '25 06:12

w.b



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!