Идентификация другого синтаксиса. Общий подход?

Программирование на Visual Basic for Applications
AlexG
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 08.12.2003 (Пн) 15:47
Откуда: Украина, Киев

Идентификация другого синтаксиса. Общий подход?

Сообщение AlexG » 23.01.2007 (Вт) 16:34

Коллеги, прошу подсказать идею реализации одного подхода....

Есть лист Excel, в котором организована числовая последовательность в 3-ех столбцах:

Номер счета / Дебетовый остаток / Кредитовый остаток

1001 / 569856 / 0
1002 / 8956/0
3056 / 0 / 3315685,23
и т.д.


Суть сводиться к следующему:

Пользователь открывает *.TXT файл, который де факто отражает СЦЕНАРИЙ расчета, который построен по собственному синтаксическому принципу, например начало *.TXT файла может быть таким:


Код: Выделить всё
Касса=(&10100+&10101+&101101+&101107)/100000
$Касса_Временная=(&10100+&10101+&101101+&101107)/100000
КоррСчет=(&101200+&101207)/100000
Ностро=&101500/100000
МБК_Прод=(&101510+&101511+,
                     &101512+&101515+&101520+&101521+&101522+,
                     &101523+&101524+&101525+&101526)/100000
ДепозНБУ=(&101211+&101212)/100000
Овердрафт=(&102000+&102200)/100000
КредЮрЛиц=(&102040+&102045+&102050+&102055+,
                         &102061+&102062+&102065+&102070+,
                         &102071+&102073+&102074+&102075+,
                         &102100+&102105+&102110+&102115+,
                         &102116+&102046+&102056+&102066+,
                         &102076+&102106)/100000


Количество строк таких инструкций может быть до 1000. Количество сценариев (*.TXT файлов) – до 10 (но за один сеанс обрабатывается только один файл).

При этом, правила синтаксиса инструкций в *.TXT жестко предопределены, например:

; - начало комментария
&10ХХХХ – дебетовый остаток балансового счета ХХХХ
&20ХХХХ – кредитовый остаток балансового счета ХХХХ
Арифметический действия: "+","-","*","/" и скобки.
Операция_сравнения:
• ">" - "больше",
• ">=" - "больше или равно",
• "<" - "меньше",
• "<=" - "меньше или равно",
• "=" - "равно",
• "<>" - "не равно".
Один условный оператор: #if b>d #then r=3 #else r=4 #endif

Вопрос: как лучше идентифицировать такие инструкции к расчету?

То есть, такая инструкция как КоррСчет=(&101200+&101207)/100000 должна вести к появлению новой переменной КоррСчет для дальнейшей манипуляции с ней в самом Excel.

Ну, можно из текстовика считать такую строку, как:

Код: Выделить всё
КредЮрЛиц=(&102040+&102045+&102050+&102055+,
                         &102061+&102062+&102065+&102070+,
                         &102071+&102073/215-&102074+&102075+,
                         &102100+&102105+&102110-&102115+,
                         &102116+&102046+&102056+&102066+,
                         &102076+&102106)/31685


Собрать ее в одну стринговую переменную.

А что дальше? Посимвольно просматривать всю строку на предмет появления жестко заданных правил синтаксиса и потом разбирать где какой синтаксис?

Боюсь долго будет….

Какой общий подход может быть в такой случае?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.01.2007 (Вт) 17:18

Что значит префикс $ в имени переменной?
Что значит запятая в конце строки?

А вообще задача достаточно простая. Сложности тут будут не с парсером, а с ошибками округления.
Lasciate ogni speranza, voi ch'entrate.

AlexG
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 08.12.2003 (Пн) 15:47
Откуда: Украина, Киев

Сообщение AlexG » 23.01.2007 (Вт) 17:23

$ просто отражает, что ВАЛЮТНАЯ касса ( для удобства). Можно обозвать по другому.

Запятая - для переноса слишком больших строк. При группировке баланса банка идет агрегирование до 200 счетов. Строка ну оооочень большая получается.

Простая? Вроде и программирую на VBA уже давно, но как приступить к анализу синтаксиса, не пойму....

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.01.2007 (Вт) 22:25

Решение первое, тупое.
Берём эксель.
Читаем строку.
Берём то, что слева от "=", и назначаем это текс в качестве имени очередной (любой) ячейки.
Всё остальное пропускаем через функцию replace, заменяя &102050, например, на A1 (или что там).
Результат помещаем в ту самую очередную ячейку в качестве формулы. Остальное эксель сам сделает...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AlexG
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 08.12.2003 (Пн) 15:47
Откуда: Украина, Киев

Сообщение AlexG » 24.01.2007 (Ср) 11:12

Понятно. Короче нужно пока что по-простому пробывать....

Сим и займемся.....

А то я уже влез в Форму Бэкуса-Наура и обратной польской последовательности...... :D

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.01.2007 (Чт) 23:23

AlexG, посмотри тут: http://bbs.vbstreets.ru/viewtopic.php?t=30670
Собственно, это я тебе и делал пример, но потом немного увлекся. Тем не менее, тот пример полностью тебе подойдет. Тебе надо только дописать функцию GetAccountValue (чтобы брала значения счетов) и заменить заглушку в CheckExpression на полноценную функцию. Самому писать проверку мне было лень, но там сложного ничего не должно быть, делай по аналогии -- группируй выражения, разбивай их по операторам сравнения и сравнивай части, вычисляя значения с помощью того же CalcTree.
Lasciate ogni speranza, voi ch'entrate.

AlexG
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 08.12.2003 (Пн) 15:47
Откуда: Украина, Киев

Сообщение AlexG » 26.01.2007 (Пт) 12:51

alibek
Друже, столько пива сколько я должен - таможня не пропустит.. :D


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 81

    TopList