Разбор текстовых файлов. Архитектура - C#
Формулировка задачи:
надо разобрать текстовый файл с структурированными разношерстными данными (с вложенносятми и т.д.)
Сделал модели под каждый возможный тип данных
Sheet
Component
Parameter
Text
Designator
и т.д. десятка полтора. У каждого куча свойств (имена у части свойств совпадают)
Оформил все в виде фабричного метода.
Сам тектовый файл разбит на строки, одна строка одна запись.
Спарсил ее, получил список словарей, где каждый атрибут строки разбит на ключ:значение.
Вопрос, как праивльно организовать из данных в парсере, полноценную модель данных.
Точнее где организховать заполнение моделей данными.
ну и вот прмиерная реализация LinePars
ну и допустим, перебираю я в цикле все "строки"
Где и как с архитектурной точки зрения, правильно будет заполнять свойства tempObj остальными данными из _ascii ? имена свойств у разных объектов совпадают, а вот их перечень - разный. Плюс некоторые объекты (за графическую часть отвчающие) являются дочерними (тут исопльзую компановщик).
public static class DataReadSchService
{
private static List<LinePars> _ascii;
}public class LinePars
{
public Dictionary<string, string> Properties;
public LinePars()
{
Properties = new Dictionary<string, string>();
}
public void AddProp(string name, string value)
{
var nameUp = name.ToUpper();
if (Properties.ContainsKey(nameUp))
{
Properties[nameUp] = value;
}
else
{
Properties.Add(nameUp, value);
}
}
public bool Check(string prop)
{
return Properties.ContainsKey(prop);
}
public string Get(string prop)
{
return Equals(Properties[prop],"*") ? string.Empty : Properties[prop];
}
public int GetInt(string prop)
{
return Convert.ToInt32(Properties[prop]);
}
public Boolean GetBool(string prop)
{
return Equals(Properties[prop],"TRUE");
}
}if (_ascii.Count == 0) return;
if (!_ascii.First().Check("WEIGHT")) return;
var weight = _ascii.First().GetInt("WEIGHT"); //заголовок
_sheet = (Sheet)_store.PrepareObject(_ascii[1]);
for (int i = 2; i < weight; i++)
{
var tempObj = _store.PrepareObject(_ascii[i]);
if (tempObj != null)
{
_sheet.Add(tempObj);
}
}Решение задачи: «Разбор текстовых файлов. Архитектура»
textual
Листинг программы
[DataContract]
[KnownType(typeof(Ellipse ))]
[KnownType(typeof(Line))]
[KnownType(typeof(Component))]
public abstract class CompObject
{
[DataMember]
public Record Record { get; set; }
}