![]() |
Поиск и удаление строки в файле по сложным условиям
Подоплека: Имеем программу Lingvo. Это мультиязычный словарь. Разработчики решили выпендриться и принудительно в разделы двуязычного направления перевода положили одноязычные словари. То есть, в разделе Ru->En лежат не только Ru-En-словари, но и Ru-Ru, и т.д. Это раздражает, поскольку хочешь получить перевод, а кроме него еще получаешь толкование слова, хотя этого не заказывал. Так вот, нужно автоматом убрать одноязычные словари из двуязычных разделов, независимо от того, какие и в каком количестве словари в этих разделах расположены.
Чтобы было понятно, я для начала приведу сильно упрощенный вариант INI-файла, с которым предстоит работать: Код:
[Group:1049-1033] Постоянные элементы: Group, AllDictionaries, разделитель ";", разделители "(" и ")"; строка AllDictionaries идет сразу за строкой Group Переменные элементы: 1049-1033 - цифры в строке могут быть любыми, так как групп много; UrbanDictionary - может быть любым, (Ru-Ru) - буквенная часть может быть любой. Механизм должен быть примерно следующим: - Ищем строку, начинающуюся с "[Group:" - Проверяем, чтобы подстрока от ":" до "-" не совпадала с подстрокой от "-" до "]" - Если совпадает, то ищем следующую строку, начинающуюся с "[Group:". А если не совпадает, то начинаем анализ строки, начинающейся с "AllDictionaries=", расположенной сразу под строкой "[Group:" - В строке "AllDictionaries=" ищем подстроку, ограниченную скобками "(" и ")" и в ней проверяем, чтобы подстрока от "(" до "-" не совпадала с подстрокой от "-" до ")" - Если нет совпадения, то переходим к поиску следующей подстроки, ограниченной скобками "(" и ")", в строке "AllDictionaries=". А если совпадение есть, то удаляем подстроку, включающую проверенные элементы и ограниченную либо "=" и ";", либо ";" и ";", либо ";" и символом конца строки. Здесь нужно быть аккуратным, чтобы случайно не удалить несколько подстрок с именами словарей от "=" до ";" или от ";" до символа конца строки. - Продолжаем поиск, проверку и удаление (если нужно) подстрок в строке "AllDictionaries=" с использованием шаблона выше. - Как только оказались проверенными и переработанными все подстроки в строке "AllDictionaries=", начинаем искать следующую строку, начинающуюся с "[Group:", где все повторяем заново. И так до конца файла. |
Цитата:
2. кодировка исходного/конечного файла: ANSI/OEM/UTF8 (BOM)/UTF16 ? P.S. в упор не нахожу в LINGVO ничего похожего на такой INI, где он хоть применяется-то? |
amel27, файл лежит по пути: %USERPROFILE%\Local Settings\Application Data\ABBYY\Lingvo\15.0\Dic\dictconf.ini
А еще здесь: %ALLUSERSPROFILE%\ABBYY\Lingvo\15.0\Dic\dictconf.ini Наверное, проще, если ты сам посмотришь, раз у тебя есть Lingvo, нежели я тебе буду все расписывать. |
Цитата:
пришлось качать весь дистрибутив и выдергивать оттуда один файл 182Кб (!), по содержимому вроде похож, хотя называется по другому, кодировка юникодовая (UTF16LE) Код:
@(SetLocal EnableDelayedExpansion Код:
DicFix.BAT dictinst.ini |
amel27,
Цитата:
Цитата:
Один момент: получившийся файл получается уже не в юникоде. Можно это как-то исправить? Там в конце файла в блоках Localization тексты на разных языках, от польского до китайского. Второй момент: можно еще жестко задать в скрипте путь к файлу как %USERPROFILE%\Local Settings\Application Data\ABBYY\Lingvo\15.0\Dic\dictconf.ini ? Третий момент: остается временный файл DicFix.tmp. |
Цитата:
|
Вложений: 1
Цитата:
P.S. Всё-таки CMD не предназначен для обработки сложных многоязыковых файлов, так как он работает с однобайтовыми OEM/ANSI строками. Т.е. чтобы пройти циклическое преобразование, обрабатываемый набор символов должен укладываться в ANSI/OEM текущей локали. Чтобы обойти это ограничение, в качестве рабочей кодировки я использовал UTF8, но это "трикс" а не правило - в некоторых случаях (на этапе UTF8 -> UTF16) может происходить искажение отдельных символов. |
Вложений: 1
amel27, одна строка незапланировано "поплыла":
Цитата:
Цитата:
Iska, специально для Вас аттач. |
m0nkrus, перевыложил в посте #7
|
amel27, спасибо. То, то надо!
|
Время: 17:06. |
Время: 17:06.
© OSzone.net 2001-