Выбрать блок данных между определёнными строками
Есть массив строк
string[] Lines = File.ReadAllLines(file);
файл примерно следующего содержания:
1
строка1
строка2
строка3
строка4
строка5
2
строка1
строка2
строка3
3
строка1
строка2
4
строка1
строка2
строка3
5
строка1
6
итд..
нужно вытаскивать строки между цифрами в отдельные Span для последующей обработки.
сделал так:
int counter = -1;
int firstBlockLine = -1;
int lastBlockLine = -1;
for(int i = 0; i < Lines.Length; i++)
{
if(int.TryParse(Lines[i],out int value))
{
if (counter < 0)
{
counter = value; // first line in file
firstBlockLine = i;
continue;
}
counter++;
if (counter <= value)
{
if (firstBlockLine >= 0)
{
lastBlockLine = i - 1;
}
else
{
firstBlockLine = i;
}
}
if (lastBlockLine > 0 && firstBlockLine >= 0)
{
Debug.WriteLine($"Block begin:{firstBlockLine}, end:{lastBlockLine}");
firstBlockLine = -1;
lastBlockLine = -1;
}
}
Но в этом варианте пропускается каждый второй блок. как мне получить индексы начала и конца всех блоков?
Ответы (2 шт):
Автор решения: MBo
→ Ссылка
Что-то много наворотили. Или отладка, или начать с простого:
last = 999999999;
for(int i = 0; i <= Lines.Length; i++)
{
if(i==Lines.Length || int.TryParse(Lines[i],out int value))
{
if (i > last)
Debug.WriteLine($"Block begin:{last}, end:{i}");
last = i;
}
}
Если работает, то подкорректировать индексы для вывода
Автор решения: SelfishCrawler
→ Ссылка
string[] Lines = File.ReadAllLines(file);
int parse = 0;
var idx = Lines.Select((v, i) => new { Index = i, Value = v }).Where(x => int.TryParse(x.Value, out parse)).Select(x => x.Index);
foreach (var i in idx)
Debug.WriteLine(i);
Вывод на вашем примере:
0
7
13
16
20
22