Наскучило адаптировать файлы данных с различными форматами и захотелось сделать что то более интеллектуальное.
Есть данные физических измерений, записанные в текстовые файлы. Формат строки каждого входного файла может различаться: это или [x1,x2,x3], или [x1,a1,a2,x2,x3,i1,i2], или еще чего (здесь x-double, a-string, i-integer). Но, ограничивая областью применения, можно получить набор аттрибутов, описывающих все возможные данные, скажем [x1,x2,x3,x4,i1,i2,i3,i4]. Мы знаем чтО каждый аттрибут строки значит и как его обрабатывать и мы знаем где аттрибут входного файла находится в нашем «метаформат»-ном файле (используя приведенные примеры):
[x1,x2,x3] –> [1, 2, 3, 0, 0, 0, 0, 0]
[x1,a1,a2,x2,x3,i1,i2] –> [1, 4, 5, 0, 6, 7, 0, 0]
Теперь вопрос: были ли где-нибудь подобные разработки и какие могут быть «подводные» камни?
gok -> Re[2]: Читаем данные из текстовых файлов
g> Здравствуйте, hrg, Вы писали: hrg>>http://xml.org/
g> Недопонял, как тут хмл привязать. Построить описательные шаблоны? g> А потом как? Пытаться просунуть файл через каждый шаблон? g> Поясните, плиз!
Есть данные физических измерений, записанные в текстовые файлы. Формат
строки каждого входного файла может различаться: это или [x1,x2,x3], или
[x1,a1,a2,x2,x3,i1,i2], или еще чего (здесь x-double, a-string, i-integer).
Но, ограничивая областью применения, можно получить набор аттрибутов,
описывающих все возможные данные, скажем [x1,x2,x3,x4,i1,i2,i3,i4]. Мы знаем
чтО каждый аттрибут строки значит и как его обрабатывать и мы знаем где
аттрибут входного файла находится в нашем «метаформат»-ном файле (используя
приведенные примеры):
[x1,x2,x3] –> [1, 2, 3, 0, 0, 0, 0, 0]
[x1,a1,a2,x2,x3,i1,i2] –> [1, 4, 5, 0, 6, 7, 0, 0]
Чего то не догоняю: как обьяснить хмл что x2 в одних файлах во 2-ой колонке, в других в 4-ой? Или на каждый формат свой шаблон писать? А в схеме описывать все возможные случаи? А как хмл обработает тип данных? Как сказать что х2 это вещественные, а колонка i1 целые числа?
hrg>>Все, что не нашлось при парсинге — равно нулю
g> Чего то не догоняю: как обьяснить хмл что x2 в одних файлах во 2-ой g> колонке, в других в 4-ой? Или на каждый формат свой шаблон писать? А g> в схеме описывать все возможные случаи? А как хмл обработает тип g> данных? Как сказать что х2 это вещественные, а колонка i1 целые числа?
Забудь про колонки — у тебя дерево
Насчет типа — кто тебе мешает использовать атрибуты:
Джентльмены, вы про разные вещи говорите. У вопрошающего, насколько я понял, файлы в текстовом формате уже есть и ему надо их распарсить в некоторые структуры данных времени выполнения. Вы же ему предлагаете сменить формат передачи данных на XML. Спору нет, предложение неплохое, но это напоминает ответ "Купи БМВ" в ответ на вопрос "Как починить трамблер в Москвиче?"...
[ Posted via RSDN@Home 1.1.4 beta 4 (303) listening to Cocteau Twins — Bluebeard ]
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, Alex Alexandrov, Вы писали:
AA>Джентльмены, вы про разные вещи говорите. У вопрошающего, насколько я понял, файлы в текстовом формате уже есть и ему надо их распарсить в некоторые структуры данных времени выполнения. Вы же ему предлагаете сменить формат передачи данных на XML. Спору нет, предложение неплохое, но это напоминает ответ "Купи БМВ" в ответ на вопрос "Как починить трамблер в Москвиче?"...
А, ну вот теперь разложилось. Правда — ваша, Алекс. Нет, hrg, уже поздно менять формат данных, их тут на многие гигабайты.
Пока что создал «тупой» массивчик со всеми возможными аттрибутами, те позиция аттрибута == тип данных. Все это зашито намертво в код (что думаю не очень накладно). Осталась проблема распознания формата данных, но тут без пользователя не обойтись, ему вопрос в диалоге со списком поддерживаемых форматов. Вот такой вот неуклюжий дизайн. Кстати что то похожее сделано в ОДБС обмене данными: каждая таблица (файл формат в нашем случае) «накрыта» своим отдельным классом.
Здравствуйте, gok, Вы писали:
gok>Наскучило адаптировать файлы данных с различными форматами и захотелось сделать что то более интеллектуальное. gok>Теперь вопрос: были ли где-нибудь подобные разработки и какие могут быть «подводные» камни?
Ну, можно открыть такой файл драйвером ODBC. Тогда для каждого файла можно создать дескриптор формата, приводящий к тому, что тебе надо. Попробуй — может поможет.
... << RSDN@Home 1.1.4 beta 4 rev. 347>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Ну, можно открыть такой файл драйвером ODBC. Тогда для каждого файла можно создать дескриптор формата, приводящий к тому, что тебе надо. Попробуй — может поможет.
Через файл dsn? Сналету чего то не получилось.
Те идея – получить коллекцию файловых дескрипторов и пытаться «пропихнуть» неизвестный файл через эту коллекцию?
Здравствуйте, gok, Вы писали: gok>Через файл dsn? Сналету чего то не получилось.
А что не получилось? Надо использовать Microsoft Text Driver (.txt, .csv) gok>Те идея – получить коллекцию файловых дескрипторов и пытаться «пропихнуть» неизвестный файл через эту коллекцию?
Я не понял вопроса, но на всякий случай — "да"
... << RSDN@Home 1.1.4 beta 4 rev. 347>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>А что не получилось? Надо использовать Microsoft Text Driver (.txt, .csv)
Я ожидал, что этот FileDSN (text driver .txt, .csv) будет создавать прослойку для общения с файлами, как классы для таблиц в СКЛ (class CTblTable : public CRecordset) с интерфейсом через DoFieldExchange().
Начал определять формат в DefineTextFormat диалоге, нажимаю Guess,
а он какую то чушь выдает: Cannot update. Database or object is read-only. Чуть позже вообще упал по памяти: odbcad32.dll referenced memory…
Здравствуйте, gok, Вы писали: gok>Я ожидал, что этот FileDSN (text driver .txt, .csv) будет создавать прослойку для общения с файлами, как классы для таблиц в СКЛ (class CTblTable : public CRecordset) с интерфейсом через DoFieldExchange().
Очень интересно. Вообще-то DSN никаких прослоек не создает. DSN — это такая штука, которая описывает подключение к ODBC-совместимому источнику. А уже потом можно задействовать MFC-классы для работы с ODBC. gok>Начал определять формат в DefineTextFormat диалоге, нажимаю Guess, gok>а он какую то чушь выдает: Cannot update. Database or object is read-only. Чуть позже вообще упал по памяти: odbcad32.dll referenced memory…
Гм. Ты откуда это делал? Просто из Control Panel — ODBC Administrator — File data source — add?
... << RSDN@Home 1.1.4 beta 4 rev. 347>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали: S>Очень интересно. Вообще-то DSN никаких прослоек не создает. DSN — это такая штука, которая описывает подключение к ODBC-совместимому источнику. А уже потом можно задействовать MFC-классы для работы с ODBC.
Да, да, дсн для этого и служит, я немного забежал уперед.
S>Гм. Ты откуда это делал? Просто из Control Panel — ODBC Administrator — File data source — add?
Да, точно через эту цепочку. Потом Add, выбираем MS TextDriver(*.txt,*csv), задаем имя дсн. Открывается odbc TextSetup диалог, перехожу в директорию с моим текстовым файлом, добавляю мое расширение, ОК(сохраняет файл с параметрами соединения). После создания этого дсн пытаюсь описать формат: Configure/DefineFormat. Тут то бонба и зарыта, не хочет он «угадывать». Ну ладно, описал аттрибуты руками, их всего то 5 и без заголовка. А дальше что? Как же его юзать? «Обертки» для такого дсн не сделать – нету его в мфс списке для CRecordset. Можно вызвать этот файл в соединении (dbase.OpenEx( _T( "DSN=…"), но в этом .dsn файле нету формата!
А что должно получиться? Должно ли быть описание формата в дсн файле? И будет ли дсн файл привязан к текстовому файлу? Или как?
Здравствуйте, gok, Вы писали: gok>Да, точно через эту цепочку. Потом Add, выбираем MS TextDriver(*.txt,*csv), задаем имя дсн. Открывается odbc TextSetup диалог, перехожу в директорию с моим текстовым файлом, добавляю мое расширение, ОК(сохраняет файл с параметрами соединения). После создания этого дсн пытаюсь описать формат: Configure/DefineFormat. Тут то бонба и зарыта, не хочет он «угадывать». Ну ладно, описал аттрибуты руками, их всего то 5 и без заголовка. А дальше что? Как же его юзать? «Обертки» для такого дсн не сделать – нету его в мфс списке для CRecordset.
Странно. Возможно, надо было создавать не файловый DSN, а вовсе даже System или User? gok>Можно вызвать этот файл в соединении (dbase.OpenEx( _T( "DSN=…"), но в этом .dsn файле нету формата!
Конечно нету. gok>А что должно получиться? Должно ли быть описание формата в дсн файле? И будет ли дсн файл привязан к текстовому файлу? Или как?
Формат хранится отдельно. В твоей папочке должен был возникнуть файл schema.ini. В нем-то и описаны форматы файлов. Попробуй настроить хотя бы один файл, и увидишь, как оно работает. Потом ты сможешь создавать schema.ini сам, непосредственно перед тем, как подключиться к файлу.
... << RSDN@Home 1.1.4 beta 4 rev. 347>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Странно. Возможно, надо было создавать не файловый DSN, а вовсе даже System или User?
Фуу… наконец то сделал через systemDsn schema.ini и «завернул» дсн в мфс (подозреваю были ограничения по доступу). Меняя имя в GetDefaultConnect() можно переключаться на другой файл данных.
Да, этот подход работает!
Но по-моему ничем не хуже обычный fopen()/fclose(). Все равно придется под каждый формат создавать отдельный классик.
Спасибо за терпеливость! Последние мои сообщения были настоящим нытьем.
Да здравствует rsdn.ru!