Если все строки начинаются с common data, identifier
, а за ними следует переменная, но ожидаемый (т.е. известный на основе идентификатора) набор значений, тогда табличный подход мог бы работать хорошо. Чтобы продолжить ваш пример, скажем, у вас есть два разных типа:
- общие данные, идентификатор, int, строка, строка, строка.
- общие данные, идентификатор, int, int, строка, строка, строка.
Вы можете создать класс, который определяет, что вы ищете:
class ItemDesc
{
public string Ident { get; private set; }
public string Fields { get; private set; }
public ItemDesc(string id, string flds)
{
Ident = id;
Fields = flds;
}
}
Свойство Fields
- это просто строка, содержащая описания односимвольных типов для переменных данных. То есть "isss" будет интерпретироваться как int,string,string,string
.
Затем вы можете создать Dictionary<string, ItemDesc>
, который вы можете использовать для поиска:
Dictionary<string, ItemDesc> ItemLookup = new Dictionary<string, ItemDesc>
{
{ "ItemType1", new ItemDesc("ItemType1", "isss") },
{ "ItemType2", new ItemDesc("ItemType2", "iisss") },
};
Теперь, когда вы читаете строку, используйте string.Split()
, чтобы разбить ее на поля. Получите идентификатор, найдите его в словаре, чтобы получить описания элементов, а затем проанализируйте остальные поля. Что-то вроде:
string line = GetLine();
var fields = line.Split(',');
// somehow get the identifier
string id = GetIdentifier();
ItemDesc desc;
if (!ItemLookup.TryGetValue(id, out desc))
{
// unrecognized identifier
}
else
{
int fieldNo = 3; // or whatever field is after the identifier
foreach (var c in desc.Fields)
{
switch (c)
{
case 'i' :
// try to parse an int and save it.
break;
case 's' :
// save the string
break;
default:
// error, unknown field type
break;
}
++fieldNo;
}
}
// at this point if no errors occurred, then you have a collection
// of parsed fields that you saved. You can now create your object.