Разбор текстовых файлов. Архитектура - 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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д