Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Распарзить выражение (формулу Excel) / 14 сообщений из 14, страница 1 из 1
17.10.2018, 11:13
    #39718624
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
Господа, как подойти к решению такой задачи оптимальным способом?

Необходимо взять строковое написание произвольной формулы Excel

"=C3/G$6", "=SQRT(SUM(A1:B3)/AVG([$D33:F$1])*FF88)" и т.п.

найти все координаты (A1,B3, FF88), изменить их по заданным правилам и собрать формулу в исходном виде с новыми координатами.

Regex может оказать недостаточно, чтобы решить эту задачу (либо может кто-то подскажет, как круто подойти к данной проблеме на Regex). А к Excel Automation прибегать не хочется.

Нежно что-то вроде ExpressionTrees, но не полномасштабный компилятор.
...
Рейтинг: 0 / 0
17.10.2018, 11:24
    #39718628
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
А в стиле RC не проще работать будет, или по ТЗ это невозможно?
...
Рейтинг: 0 / 0
17.10.2018, 11:27
    #39718631
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
С другой стороны, почему не поможет Regex?
несколько букв+несколько цифр с необязательным префиксом $
Диапазоны через двоеточие, без двоеточия - отдельные ячейки
Что я упускаю?
...
Рейтинг: 0 / 0
17.10.2018, 11:36
    #39718635
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
Shocker.ProА в стиле RC не проще работать будет, или по ТЗ это невозможно?

В файле координаты лежать в классическом стиле даже если визуальны вы видите RC.
...
Рейтинг: 0 / 0
17.10.2018, 11:38
    #39718636
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
Shocker.Pro,

вот здесь заменять не надо "Это строка A1". Поэтому regex может оказаться сложным
...
Рейтинг: 0 / 0
17.10.2018, 11:38
    #39718637
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
Нужен Tokenizer
...
Рейтинг: 0 / 0
17.10.2018, 11:50
    #39718653
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
a_voroninвот здесь заменять не надо "Это строка A1". Поэтому regex может оказаться сложнымОк, исключить строковые литералы внутри формул (можно сделать до поиска ячеек). Что еще?
...
Рейтинг: 0 / 0
17.10.2018, 12:22
    #39718695
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
С другой стороны, формулы экселя имеют довольно-таки стандартный синтаксис, поэтому можно попробовать использовать каую-либо библиотеку разбора формул, а потом просмотреть список аргументов на предмет соответствия паттерну адреса диапазона или адреса ячейки. Но я бы попробовал обойтись все-таки обработкой строк, возможно, я просто не вижу еще каких-то противопоказаний, которые видите вы.

ЗЫ: вспомнил еще один вариант задания диапазона А:А, A:F, 1:1, нужно будет тоже учесть
...
Рейтинг: 0 / 0
17.10.2018, 13:34
    #39718763
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
Shocker.Pro,

Вопрос, что именно рекомендуется взять. Ибо регулярки писать у меня проблем нет.

Код: c#
1.
2.
3.
4.
5.
        /// Регулярное выражение для разбора диапазона в формате 'Лист1!AC25:BD670' с выявлением компонентов
        /// sheet='Лист1' R1 = '25' C1 = 'AC' R2 = '670' C2 = 'BD'
        /// </summary>
        static Regex namedRangeMatch = new Regex(
            "\\'?(?<sheet>([^,'!]+)|[^,'!]+)\\'?\\!\\$?(?<C1>[A-Z]+)\\$?(?<R1>[0-9]+)\\:\\$?(?<C2>[A-Z]+)\\$?(?<R2>[0-9]+)");
...
Рейтинг: 0 / 0
17.10.2018, 13:53
    #39718776
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
a_voroninкак круто подойти к данной проблеме на Regexa_voroninИбо регулярки писать у меня проблем нет.не, лично я не подскажу с библиотекой, не использовал такие, я думал, проблема с Regex, да и не увидел пока проблемы сделать это на Regex
...
Рейтинг: 0 / 0
17.10.2018, 13:54
    #39718777
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
ЗЫ:a_voronin
Код: c#
1.
2.
        static Regex namedRangeMatch = new Regex(
            "\\'?(?<sheet>([^,'!]+)|[^,'!]+)\\'?\\!\\$?(?<C1>[A-Z]+)\\$?(?<R1>[0-9]+)\\:\\$?(?<C2>[A-Z]+)\\$?(?<R2>[0-9]+)");

Все же регулярку куда как проще писать и анализировать через @""
...
Рейтинг: 0 / 0
17.10.2018, 16:45
    #39718973
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
a_voroninНужен Tokenizer
Браво.
Вы в гугл заглядывали? Если что - по запросу в выдаче первая ссылка ведет на SoF , на котором вторая ссылка вот сюда . В тексте внизу - ссылка на архив с проектом парсера. Парсер сделан как раз на токенайзере.
...
Рейтинг: 0 / 0
17.10.2018, 17:57
    #39719023
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
Сон Веры Павловныa_voroninНужен Tokenizer
Браво.
Вы в гугл заглядывали? Если что - по запросу в выдаче первая ссылка ведет на SoF , на котором вторая ссылка вот сюда . В тексте внизу - ссылка на архив с проектом парсера. Парсер сделан как раз на токенайзере.

Заглядывал, только выбрал не первую ссылку, а четвертую

https://github.com/spreadsheetlab/XLParser
и уже допили этот проект под свои нужды.
...
Рейтинг: 0 / 0
18.10.2018, 06:20
    #39719154
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарзить выражение (формулу Excel)
a_voroninЗаглядывал, только выбрал не первую ссылку, а четвертую

https://github.com/spreadsheetlab/XLParser
и уже допили этот проект под свои нужды.
Да, эта библиотека получше будет. Да и поновее.
А регэкспами такие задачи в общем случае не являются - вложенные конструкции произвольной глубины (и не дай б-г контекстно-зависимые) автоматными языками не являются (а RE - это конечный автомат).
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Распарзить выражение (формулу Excel) / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]