|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поиск и удаление строки в файле по сложным условиям |
|
CMD/BAT - [решено] Поиск и удаление строки в файле по сложным условиям
|
Старожил Сообщения: 148 |
Профиль | Сайт | Отправить PM | Цитировать Подоплека: Имеем программу Lingvo. Это мультиязычный словарь. Разработчики решили выпендриться и принудительно в разделы двуязычного направления перевода положили одноязычные словари. То есть, в разделе Ru->En лежат не только Ru-En-словари, но и Ru-Ru, и т.д. Это раздражает, поскольку хочешь получить перевод, а кроме него еще получаешь толкование слова, хотя этого не заказывал. Так вот, нужно автоматом убрать одноязычные словари из двуязычных разделов, независимо от того, какие и в каком количестве словари в этих разделах расположены.
Чтобы было понятно, я для начала приведу сильно упрощенный вариант INI-файла, с которым предстоит работать: [Group:1049-1033] AllDictionaries=AmericanEnglish (Ru-En);UrbanDictionary (Ru-Ru) [Group:1049-1049] AllDictionaries=UrbanDictionary (Ru-Ru) Постоянные элементы: Group, AllDictionaries, разделитель ";", разделители "(" и ")"; строка AllDictionaries идет сразу за строкой Group Переменные элементы: 1049-1033 - цифры в строке могут быть любыми, так как групп много; UrbanDictionary - может быть любым, (Ru-Ru) - буквенная часть может быть любой. Механизм должен быть примерно следующим: - Ищем строку, начинающуюся с "[Group:" - Проверяем, чтобы подстрока от ":" до "-" не совпадала с подстрокой от "-" до "]" - Если совпадает, то ищем следующую строку, начинающуюся с "[Group:". А если не совпадает, то начинаем анализ строки, начинающейся с "AllDictionaries=", расположенной сразу под строкой "[Group:" - В строке "AllDictionaries=" ищем подстроку, ограниченную скобками "(" и ")" и в ней проверяем, чтобы подстрока от "(" до "-" не совпадала с подстрокой от "-" до ")" - Если нет совпадения, то переходим к поиску следующей подстроки, ограниченной скобками "(" и ")", в строке "AllDictionaries=". А если совпадение есть, то удаляем подстроку, включающую проверенные элементы и ограниченную либо "=" и ";", либо ";" и ";", либо ";" и символом конца строки. Здесь нужно быть аккуратным, чтобы случайно не удалить несколько подстрок с именами словарей от "=" до ";" или от ";" до символа конца строки. - Продолжаем поиск, проверку и удаление (если нужно) подстрок в строке "AllDictionaries=" с использованием шаблона выше. - Как только оказались проверенными и переработанными все подстроки в строке "AllDictionaries=", начинаем искать следующую строку, начинающуюся с "[Group:", где все повторяем заново. И так до конца файла. |
|
Отправлено: 11:33, 24-06-2011 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата m0nkrus:
2. кодировка исходного/конечного файла: ANSI/OEM/UTF8 (BOM)/UTF16 ? P.S. в упор не нахожу в LINGVO ничего похожего на такой INI, где он хоть применяется-то? |
|
Последний раз редактировалось amel27, 24-06-2011 в 21:05. Причина: добавлен п.2 Отправлено: 17:54, 24-06-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать amel27, файл лежит по пути: %USERPROFILE%\Local Settings\Application Data\ABBYY\Lingvo\15.0\Dic\dictconf.ini
А еще здесь: %ALLUSERSPROFILE%\ABBYY\Lingvo\15.0\Dic\dictconf.ini Наверное, проще, если ты сам посмотришь, раз у тебя есть Lingvo, нежели я тебе буду все расписывать. |
Последний раз редактировалось m0nkrus, 24-06-2011 в 23:49. Отправлено: 21:41, 24-06-2011 | #3 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата m0nkrus:
пришлось качать весь дистрибутив и выдергивать оттуда один файл 182Кб (!), по содержимому вроде похож, хотя называется по другому, кодировка юникодовая (UTF16LE) @(SetLocal EnableDelayedExpansion set "$g=0"& for /f "tokens=1* delims=:" %%a in ('type "%~1"^|findstr/n $') do @(set "$a=%%b"& set "$=" if /i "!$a:~,7!"=="[Group:" set/a "$g=!$a:~7,-1!" if /i "!$a:~,16!"=="AllDictionaries=" if !$g! neq 0 (set ^"$a=!$a:;=^ !" for /f "tokens=1-3 delims=(-)" %%x in ("!$a:~16!") do @if /i not "%%y"=="%%z" set "$=!$!%%x(%%y-%%z);") if defined $ (echo AllDictionaries=!$:~,-1!) else echo:!$a!))>"%~n0.tmp" @(set/p .="яю"& cmd/u /c type "%~n0.tmp")>"%~1"<nul |
|
Отправлено: 11:30, 25-06-2011 | #4 |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать amel27,
Цитата:
Цитата:
Один момент: получившийся файл получается уже не в юникоде. Можно это как-то исправить? Там в конце файла в блоках Localization тексты на разных языках, от польского до китайского. Второй момент: можно еще жестко задать в скрипте путь к файлу как %USERPROFILE%\Local Settings\Application Data\ABBYY\Lingvo\15.0\Dic\dictconf.ini ? Третий момент: остается временный файл DicFix.tmp. |
|||
Отправлено: 11:52, 25-06-2011 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата m0nkrus:
|
|
Отправлено: 13:29, 25-06-2011 | #6 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата m0nkrus:
P.S. Всё-таки CMD не предназначен для обработки сложных многоязыковых файлов, так как он работает с однобайтовыми OEM/ANSI строками. Т.е. чтобы пройти циклическое преобразование, обрабатываемый набор символов должен укладываться в ANSI/OEM текущей локали. Чтобы обойти это ограничение, в качестве рабочей кодировки я использовал UTF8, но это "трикс" а не правило - в некоторых случаях (на этапе UTF8 -> UTF16) может происходить искажение отдельных символов. |
|
Последний раз редактировалось amel27, 26-06-2011 в 08:38. Причина: доработка Отправлено: 21:34, 25-06-2011 | #7 |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать amel27, одна строка незапланировано "поплыла":
Цитата:
Цитата:
Iska, специально для Вас аттач. |
||
Отправлено: 23:23, 25-06-2011 | #8 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать m0nkrus, перевыложил в посте #7
|
Отправлено: 08:40, 26-06-2011 | #9 |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать amel27, спасибо. То, то надо!
|
Отправлено: 10:37, 26-06-2011 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Поиск, удаление, замена и добавление строк в текстового файле. Что возможно? | akrav | Скриптовые языки администрирования Windows | 8 | 06-12-2015 13:22 | |
PowerShell - [решено] Удаление пустой строки в файле | monolit | Скриптовые языки администрирования Windows | 4 | 17-08-2013 13:57 | |
Любой язык - [решено] Поиск неизвестной строки в файле, ограниченной известными символами | m0nkrus | Скриптовые языки администрирования Windows | 8 | 24-04-2012 12:27 | |
CMD/BAT - [решено] Поиск строки в файле и замена её на набор из случайных чисел и букв | Sub-Zero | Скриптовые языки администрирования Windows | 6 | 08-02-2011 18:54 | |
[решено] поиск строки в WORD файле.... | garanov | AutoIt | 3 | 19-03-2010 09:16 |
|