Попытка написать программу aC#, которая анализирует текстовый файл, содержащий данные, разделенные заголовками в квадратных скобках.
Я пишу программу, которая анализирует определенный текстовый файл, в котором есть данные, которые я собираюсь обработать позже. Каждая часть разделена заголовком в квадратных скобках. Мне было интересно, как я могу поместить каждый сегмент в массив, используя заголовок в качестве имени для массива. Ниже приведен пример начала текстового файла. я настроил форму, которая позволяет вам выбрать файл, который вы хотите обработать, и я также установил способ обработки его построчно, используя objReader.ReadLine в цикле
[Params]
Version=106
Monitor=34
SMode=111111100
Date=20090725
StartTime=13:56:44.0
Length=00:24:30.5
Interval=1
Upper1=0
Lower1=0
Upper2=0
Lower2=0
Upper3=0
Lower3=0
Timer1=00:00:00.0
Timer2=00:00:00.0
Timer3=00:00:00.0
ActiveLimit=0
MaxHR=180
RestHR=70
StartDelay=0
VO2max=51
Weight=0
[Note]
TT Warm Up
[IntTimes]
00:24:30.5 140 83 154 174
0 0 0 41 112 33
0 0 0 0 0
0 12080 0 280 0 0
0 0 0 0 0 0
[IntNotes]
[ExtraData]
[Summary-123]
1470 0 1470 0 0 0
180 0 0 70
1470 0 1470 0 0 0
180 0 0 70
0 0 0 0 0 0
180 0 0 70
0 1470
[Summary-TH]
1470 0 1470 0 0 0
180 0 0 70
0 1470
[HRZones]
180
162
144
126
108
90
0
0
0
0
0
3 ответа
Вы можете использовать шаблон что-то вроде этого.
List<String> paramsList;
List<String> noteList;
List<String> tempList;
while (line = objReader.ReadLine()) {
if (line.StartsWith("[")) {
// start new array
if (line.Equals("[Params]"))
tempList = paramsList = new List<String>();
else if (line.Equals("[Note]"))
tempList = noteList = new List<String>();
// etc.
} else if (String.IsNullOrEmpty(line)) {
// ignore, end of array
} else {
// add element to array
tempList.Add(line);
}
}
// now use paramsList, noteList, etc. as needed
Я не совсем уверен, как вы хотите использовать заголовок в качестве имени для массива. Заголовки всегда одинаковы для всех файлов? Вы не можете динамически назначать имя переменной на основе строки, и вы не захотите, если вам понадобится использовать ее в дальнейшей обработке.
Я бы разобрал это в словарь:
Dictionary<string, List<string>> d = new Dictionary<string, List<string>>();
using (StreamReader reader = new StreamReader("filename"))
{
string token = null;
string line;
while ((line = reader.ReadLine()) != null)
{
if (line.StartsWith("["))
d[token] = new List<string>();
else
d[token].Add(line);
}
}
Приведенный выше подход также добавит строки данных, если у вас есть дубликаты токенов.
Поскольку этот формат файла выходит за рамки обычного INI-файла (см. Комментарий Дэвида Йоу в ответе Николаса Кэри), я бы использовал правильный анализатор, созданный генератором анализатора. Мой инструмент выбора - GOLD Parser Builder, но любой другой генератор синтаксических анализаторов может работать так же хорошо.