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