ПРОБЛЕМЫ ОБРАБОТКИ (RegExp; Scripts; Soft; Автоматизация)

Обсуждения по русски

Moderators: Timur_75, nikolay_l

User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

ПРОБЛЕМЫ ОБРАБОТКИ (RegExp; Scripts; Soft; Автоматизация)

Post by nikolay_l »

Топик для разных заметок и вопросов касающихся обработки текста на пути создания модулей.
Эта ветка нужна как склад полезных советов.
Возможно в будущем я или кто то другой прикрутит к ней навигатор.
Ветка будет регулярно чиститься от накопившихся вопросов и ответов.
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

TextPipe

Post by nikolay_l »

Как то давно заметил что некоторые с виду нормальные текстовые файлы являются поломанными. Это никак не обнаруживается но при их конвертации в итоге возникают проблемы. Например на таком файле может зависнуть TextPipe.
Пришел к выводу что перед обработкой файлов нужна их конвертация в UTF-16 LE (= UCS2 LE) в TextPipe. Это не меняет файла но делает его более валидным.

При поиске и замене в TextPipe (работая с русскими текстами) следует использовать кодировку UTF-16 LE (= UCS2 LE) эта кодировка выставляется в программе и в ней же должны находится обрабатываемые файлы.
  • Внимание! не производите с помощью TextPipe поиск и замену для коротких сочетаний скобок. Это может привести к тому что на выходе будут стоять китайские Иероглифы. Поэтому обработку коротких сочетаний знаков типа :<>; (\]; ]); {[ и т.п. я с некоторых пор перенес на плечи UltraEdit. Это не так быстро, но зато надежно.
[/list]

Если нужно добавлять текстовые поля с помощью TextPipe то тогда файлы должны находится в кодировке UTF-8 (Лично я всегда использую файлы без метки BOM).
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

UltraEdit

Post by nikolay_l »

Производить операции с регулярными выражениями в UltraEdit лучше используя опцию поиска и замены в файлах (на диске). У меня бывали случаи с 18й версией когда она неправильно отрабатывала текст открытого файла. Текст правда был довольно объемный для подстановок.

Программа UltraEdit работает при пакетной обработке файлов в UCS-2 LE некорректно и к тому же жутко медленно (во много раз медленнее чем с UTF-8). Поэтому для пакетной обработки файлов на диске нужно конвертировать их в UTF-8 (без BOM).

Пример глючащей регулярки (её работоспособность может зависеть от компа или размера файла)
    • Найти:

      Code: Select all

      ^(\S.*)
      Заменить:

      Code: Select all

      </td></tr></table></body></html>
      	
      	<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      		<title>\1</title>
      		</head><p align=center><body><a href="tw://[self]?t=_abrv">■</a> | <a href="tw://bk.DSL.info.gbk?t=abbrv">■</a> | <a href="tw://[self]?t=_about">■</a> | <a href="tw://[self]?t=_NB">■</a> | <a href="tw://bk.DSL.info.gbk?t=info">■</a> | <a href="tw://[self]?t=-0000000001">■</a>
      		<table width="90%" cellspacing="0" border="0"><tr bgcolor="#A7BAB1"><td width="2%"><td>
      		<font color="#F0EEEC" size="5">
      \1
      		</font><hr>
      
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Notepad++

Post by nikolay_l »

В Notepad++ файл в кодировке UTF-8 без BOM индицируется как "ANSI as UTF-8". Этого не следует бояться. Как и того что при попытках конвертации таких файлов отсутствие в них метки BOM сохраняется.

TextPipe часто некорректно отображает текущую кодировку документа. Если вам точно надо знать в какой кодировке документ то лучше вам его будет открыть в программе EmEditor.

Notepad++ иногда при копировании текстов через буфер обмена подменяет символы используемые шрифтом Arial Unicode MS на аналоги. Заметил эту проблему впервые тогда, когда вставлял из Notepad++ списки для поиска и замены в TextPipe.
        • Code: Select all

          Проблемные оригиналы <>?/\:*" 
          Безопасные аналоги <>?/\:*"
В целом это не должно беспокоить. Но иногда такая бесплатная услуга от программы Notepad++ крайне неприемлема. В частности если вы намерены подменить не отображаемые файловой системой (windows) символы в тегах <titles>....</titles> (для последующего переименования html файлов с помощью программы PowerGrep).

Точно не знаю почему, но вероятно все тектовые редакторы которыми вы пользуетесь стоит настроить на использование кодировки UTF-16LE по умолчанию. Кажется с ней меньше всего возникает проблем при работе в двух других популярных редакторах - AkelPad и EmEditor.
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

PowerGrep

Post by nikolay_l »

PowerGrep - особенности переименования html файлов. если вам надо переименовать файлы html (в каталогах на диске) то с этим легко может справиться PowerGrep. Особенностью программы является то что она (опционально) создает папку в которую помещает образовавшиеся в ходе операции переименования дубликаты. Все бы ничего но программа удаляет часть дубликатов (особенно если их много). Уж не знаю по какому принципу она это делает - не проверял :mrgreen:
Сначала я думал что это особенность Portable версии но потом я пришёл к выводу что результат несколько хаотичен. В более новом билде этот баг как оказалось пофиксили.
      • Использование программы PowerGrep имеет смысл если вам надо просмотреть названия файлов еще до процесса импорта. Это может потребоваться при конвертации словарей, но скорее всего не потребуется при конвертации html страниц скачанных с сайтов. Так как Importer Tool (с апреля 2013 года) уже умеет переименовывать статьи по заданному тегу на этапе конвертации. Дело в том что теги html страниц достаточно чистые сами по себе, а теги которые приходится создавать искусственно часто содержат лишние элементы словарной разметки в зависимости от спецификации исходника
При больших объемах PowerGrep работает довольно медленно - его можно ускорить отключив разного рода журналирование логов и историй а также использованием опции QuickExecute.
Видео иллюстрирующее процесс конвертации

Сценарии к PowerGrep для переименования файлов html по тегам <H2> и <TITLE>:
(примечание - от вас потребуется открыть сценарий в программе и выбрать в селекторе каталог который планируете обработать).
Attachments
PowerGgrep - пакетное переименование html файлов по H2.rar
(539 Bytes) Downloaded 544 times
PowerGgrep пакетное переименование html файлов по TITLE.rar
(550 Bytes) Downloaded 528 times
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

ImporterTool

Post by nikolay_l »

ImporterTool (или IT)
импортирует довольно неплохо простенькие html файлы. Именно за счет этого и были созданы все словари из под Lingvo. Что важно IT "видит" имена файлов с разного рода иероглифами (Windows использует UTF-16 для имен файлов - если у вас имена в Проводнике отображаются квадратиками, то советую поставить Directory Opus и настроить для показа файлов и папок шрифт типа Arial Unicode MS для полноценного отображения символов папок и файлов). Особенностью импорта является то что разные версии ImporterTool имеют разный рендеринг html страниц. Во всяком случае версия 72 заметно отличается от 0.73. Например версия 0.72 создает файлы меньшего размера с более легкими таблицами. Если у вас нет желания что бы большие таблицы зависали в theWord то версия 0.73 вам категорически не подходит. Если импортируется какая-то художественная книга, то этого в принципе можно сильно не опасаться. Риск оправдан так как v.0.73 имеет заметные преимущества по части переноса стиля текста.

Кроме того версия 0.73 (в отличии от 0.72) создаёт поломанные Bookmarks. А исправлена эта проблема скорее всего будет в версии 0.75. Так как о проблеме стало известно уже после выхода v.074. Версия 0.74 в принципе это та-же 0.73 с фиксом (касающимся заполнения таблиц в режиме сортировки файлов). Заметное отличие версии 0.72 от 0.73 состоит в том что ранняя версия использует в процессе конвертации шрифт прописанный в первых строках языкового файла. А поздняя версия использует фиксированный шрифт (типа Tahoma) что делает v.73 малопригодной для импорта файлов диапазон символов которых не влазит в узкие границы этой Tahoma.

Что немаловажно Costas прислушивается к мнению пользователей в вопросах развития своего ПО. Так по моей просьбе он внедрил опцию переименования на лету импортируемых материалов.
Пример регулярного выражения для использования содержимого тега <Hn>...</Hn> в качестве заголовка карточки (где n - любое число от 0 до 9): Использование этого выражения на практике привело к широкому появлению оглавлений сформированных за счет отступа:
Image

Проблема конверсии амперсанда (&)
Большие неприятности для IT доставляет присутствие символа точки с запятой (;) в строке с амперсандом. Еще повезет если он (амперсанд) после конвертации в модуль будет стоять не в начале новой строки вместе с внезапно возникшим переносом. По этой причине амперсанд следует аккуратно заменять в файлах где это можно на его безопасный аналог : / U+FF06
      • Пример макроса для UltraEdit конвертирующего амперсанд на безопасный аналог:

        Code: Select all

        InsertMode
        ColumnModeOff
        HexOff
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.html" "&" "пј†"
      • :!: Внимание! Не удачный выбор последовательности или действий в ходе конвертации мнемоник и замены амперсанда на безопасный (после всех манипуляций по конвертации мнемоник) сделает очевидным для пользователя что в словаре встречаются некие коды требующие расшифровки. Ну по крайней мере это лучше чем пустое место на месте какого нибудь важного медицинского значка. :mrgreen:
Проблема конверсии мнемоник и числовых кодов Unicode.
Может возникнуть если вы импортируете html файлы напрямую с помощью Importer Tool. Версия 72 не все эквиваленты символов знает и соответственно не может конвертировать записи в символы Юникода.

Мало того и некоторые символы Unicoda неокрепший интеллект IT способен превращать в символы Кириллицы.
Пример тому смотрите на видео:
https://www.youtube.com/watch?v=FbrF8jaOvW0
На вопрос "каг-таг?" Костас кажется мысленно похвалил меня за изобретательность, но ответил что то вроде "IT не предназначена для конвертации html". :mrgreen: Так что в результате это даже и не ошибка а неудавшийся результат "научного" эксперимента.
Короче предварительная обработка числовых кодов Unicode и мнемоник при прямом импорте html крайне желательна.

В принципе эта проблема не катастрофичная - решается она преобразованием кодов с помощью пакетной фильтрации в TextPipe. После чего знак амперсанда & заменяется его безопасным аналогом U+FF06 Однако эти действия нужно производить на определенных стадиях процесса конвертации словарей из-за определенной вероятности появления в тексте нежелательных тегов.
    • :!: Внимание! Не следует бездумно заменять все в подряд в файлах html. Это может привести к тому что в коде html появятся символы которые интерпретатор html языка посчитает служебными символами html языка. Например могут появится скобки вида < >. И текст заключенный в эти скобки будет восприниматься как тег. Кроме того / (слеш) и вопросительный знак (?) применяются в языке разметки html в гиперссылках. Поэтому такие знаки надо заменять сразу на безопасные для html (а заодно и файловой системы) с помощью UltraEdit или TextPipe (бездумную замену в EmEditor как это описано ниже в данном конкретном случае не используйте).
      • Code: Select all

        Символы мнемоник имеют вид &tilde;
        Символы числовых кодов Unicode имеют вид &#732;
Это проблема может быть решена как минимум двумя путями. С помощью программы EmEditor и с помощью поиска и замены в TextPipe. Если у вас один файл то его проще откорректировать в EmEditor. Если много то лучше использовать TextPipe.

В EmEditor это делается через контекстное меню (правый клик мыши)
=> Преобразовать выделение => Прочие => Числовые имена символов XML|HTML в Unicode

В этом меню есть и другие варианты конвертации:

Image


В TextPipe аналогичная проблема решается с помощью списка поиска и замен.
Image

Пример фильтра для версии 9.52:
Attachments
Замена числовых символов Unicode и мнемоник (фильтр TextPipe).rar
(4.16 KiB) Downloaded 542 times
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Управляющие символы

Post by nikolay_l »

Изредка в файлах могут встречаются управляющие символы. В простом текстовом файле при обычном режиме их не видно, но порой они способны сбить с толку регулярное выражение обрабатывающее для вас исходник. По этой причине борьба с управляющими символами должна находится в списке приоритетных задач в технологическом цикле.
Подробнее об управляющих символах : можно почитать в Википедии
      • Пример макроса для UltraEdit который снимет некоторые проблемы с управляющими символами

        Code: Select all

        InsertMode
        ColumnModeOff
        HexOff
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.html" "В…" " "
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.html" "" "[?]"
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.htm" "п»ї" ""
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.html" "п»ї" ""
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.html" "" "☏"
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.html" "" "-"
        PerlReOn
        ReplInFiles Recursive Log UseEncoding 65001 "E:\Macro\" "*.html" "" ""
        
Обратите внимание - на скриншоте тот же самый текст что и в вышеприведенном коде - и часть управляющих символов здесь видна.
Image
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Видео-пример использования RegExp-ов в UltraEdit

Post by nikolay_l »

Видео пример: Смена регистра заголовка словаря DSL в UltraEdit
Примечание: В данном случае интерпретатор словарной оболочки распознает пробельный символ в начале строки как тело карточки а не пробельный символ как заголовок карточки. Такая модель характерна для словарей Lingvo (формат DSL/LSD). Возможно она используется и еще где-то.

Видео пример: Тестирование очистки HTML тегов <Title> от мусора
Примечание. Этот пример может быть полезен в разных ситуациях. В данном случае идет очистка от левых тегов появившихся после конвертации заголовка словаря в тег <Title>. Часто содержимое этого тега планировалось использовать в качестве имени файла и соответственно мусор в нем был не нужен.

Макрос для UltraEdit для простановки ударений над гласными буквами.
Пакетная обработка .txt файлов внутри каталога E:\Macro\
Файлы должны находиться в кодировке UTF-16LE или UCS-2 LE
  • Code: Select all

    InsertMode 
    ColumnModeOff 
    HexOff 
    PerlReOn 
    ReplInFiles RegExp Recursive Log "E:\Macro\" "*.txt" "\['\](\S)\[\/'\]" "\1МЃ"
в DSL файлах словарей Lingvo ударение искусственно создается тегами [']ю[/']
если между тегами поставить гласную букву то в словаре она отобразится с диакритическим знаком ударения. Если вам надо убрать теги и жёстко вписать букву с диакритикой то это выражение как раз для этого и служит. В принципе теги могут быть и другого вида (просто надо будет немного подстроится под конкретную ситуацию).
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Трудности копирования готовых RegExp-ов :)

Post by nikolay_l »

Часто возникает ситуация неверного применения верно составленного выражения. Например если вы просили помочь вам составить регулярку и она у вас не сработала, то после долгих мучений правильный ответ на вопрос "почему?" может быть таким:
«ОЙ... - просто в конце регэкспа был пробел который я не заметил когда скопировал.» :mrgreen:
Спецификации RegExp для разных программ
Notepad++ http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Regular_Expressions

Учебники и онлайновые сервисы построения RegExp-ов
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Пакетная резка текстовых файлов в TextPipe

Post by nikolay_l »

Пакетная резка текстовых файлов в TextPipe процедура очень несложная. Потребуется несколько вещей:
  • Нужны файлы в UTF-8 (можно их конвертировать этим же фильтром если научится вовремя снимать верхний красный крестик и настраивать фильтр который с ним связан)
  • Настроить шаблон для переименования файлов
  • Установить интересуемый способ нарезки.
  • далее надо перетащить файл или папку для порезки
  • Если перетащили папку то автоматически подставится маска *.* которая значит что будут затронуты все имена файлов и все расширения файлов. Можно задать конкретный тип файла который будет затронут обработкой. Например: *.txt или *.html
Image
Attachments
Резка текстовых файлов в кодировке UTF-8.rar
(1.26 KiB) Downloaded 540 times
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

PowerShell - как автоматически распределить содержимое папки

Post by nikolay_l »

Windows PowerShell может автоматически распределить перегруженный файлами каталог
Если у вас в одной папке много файлов то можно раскидать их по каталогам с заданным числом файлов. Это например может быть полезно когда ваша программа имеет ограничение на одновременное число обрабатываемых файлов. Например такая особенность есть у триального режима программы Convert Doc. Программа очень неплохо конвертирует html файлы в RTF (используя 2 разных - на выбор) механизма конвертации. Но у программы очень неплохая защита и регистрация с помощью KeyGen часто слетает. Так что в свое время приходилось максимально долго сидеть на триальном режиме.

В данном примере речь идет о папке split на диске E:\ и о группировке по 1000 файлов на каталог.
Код скрипта копируется в буфер обмена и вставляется в PowerShell правым кликом мыши.
  • Code: Select all

    function SplitFolder([string] $strSourceFolderPath, [int] $nMaxFileCount)
    {
    $strParentFolderPath = [System.IO.Path]::GetDirectoryName($strSourceFolderPath);
    
    $arrWavFiles = [System.IO.Directory]::GetFiles($strSourceFolderPath);
    
    [Array]::Sort($arrWavFiles);
    
    $nFolderNumber = 0;
    
    for ($i = 0; $i -lt $arrWavFiles.Length; ++$i)
    {
    $i + 1;
    
    if (0 -eq ($i % $nMaxFileCount))
    {
    ++$nFolderNumber;
    [System.IO.Directory]::CreateDirectory($strParentFolderPath + "\split" + $nFolderNumber.ToString("D2")) > $nul;
    }
    
    [System.IO.File]::Move($arrWavFiles[$i], $strParentFolderPath + "\split" + $nFolderNumber.ToString("D2") + "\" + [System.IO.Path]::GetFileName($arrWavFiles[$i]));
    }
    
    [System.IO.Directory]::Delete($strSourceFolderPath);
    }
    
    SplitFolder "e:\split" 1000
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Способ обойти ограничения наложенные на словари Стронга

Post by nikolay_l »

Автор идеи brat-h.
Обход ограничения программы TheWord связанного с отображением номеров Стронга. До появления этого решения программа показывала лишь одно определение из одного заданного модуля конкорданции [Стронга].

Проблема решается вводом дополнительного регулярного выражения в тело файла библейского модуля которое позволяет нажатием на клавишу "g" превращать номера Стронга из служебной категории в словарную. Таким образом при наведении на номер Стронга, программа будет работать так как она обычно работает со словарем подсказок обыскивая все словари которые вы к ней подключите.

Библейский модуль должен содержать номера Стронга, но не стоит вводить код в те модули которые имеют переключение для сравнения версий между например Вескоттом-Хортом, Нестле Аландом и UBS. В таких модулях по непонятным причинам может "пропасть" часть текста.
http://www.youtube.com/watch?v=kZizNMICZ90

Code: Select all

verse.rule="<W([GH]\d+?)>"          "<NB toggle=^g><W$1><Nb><NB toggle=g><sup><font color=#D55A00 size=0> $1</font></sup><Nb>"
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Экспорт топиков

Post by nikolay_l »

Экспортировать список тематического дерева из отдельного *.twm модуля можно с помощью программы SQLite Expert
http://youtu.be/84ZV-WWUmrY

Если возникнет желание экспортировать списки для целого каталога или вообще из всех модулей, то тут может помочь программа Archivarius 3000. Она пролазит в каждый файл и сканирует все что может, - все что так или иначе связано с простым текстом. Как я понял она не может прочитать сами темы, но оглавление тем из наших баз sqlite-3 с расширением *.twm она читает очень хорошо.
    • У меня как то даже была идея сделать единый поисковый индекс для всех словарей программы. Но кажется в этом нет смысла - будет слишком большой объем модуля из-за десятков миллионов карточек-ссылок. Да и сама работа над этим модулем наверное будет довольно нудной учитывая что у нас ~4000 материалов, а способа для автоматизации процесса я пока что не нашел :mrgreen:
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Мнемоники (HTML entitles) & Числовые коды (Decimal entitles)

Post by nikolay_l »

Мнемоники (HTML entitles) & Числовые коды (Decimal entitles) - статьи и ссылки Полезные ссылки по мнемоникам и кодам (русские) - все с одного сайта:
    • Символы, вставляемые с помощью кода без изменения шрифта. http://webdesign.site3k.net/?/docs/symbolto.html
    • Непосредственно признаваемые символы, http://webdesign.site3k.net/?/docs/symbolto.html которые можно копировать прямо из окна браузера и вставлять в код хоть в блокноте но, которые, при этом, либо не имеют соответствующих клавиш на клавиатуре, либо имеют несколько вариантов отображения.
    • Символы, отображаемые с помощью шрифта "Symbol" http://webdesign.site3k.net/?/docs/symbolto.html (директива), некоторые из которых только так и удается вывести на экран (не работает в Netscape/Mozilla).
    • Справочник кодировки символов кириллицы http://webdesign.site3k.net/?/docs/unicode.html (русского и украинского алфавитов) в универсальной таблице символов Unicode
    • Кодировка «особых» символов, http://webdesign.site3k.net/?/docs/symbol.html выдернутая из документации по HTML 4.0 и доработанная
User avatar
nikolay_l
Posts: 511
Joined: Thu Dec 09, 2010 3:29 pm
Location: Россия, Крым, Севастополь
Contact:

Коррекция "убитых" имен файлов в Total Commader

Post by nikolay_l »

Может быть полезен модуль к Total Commander для расширения функций переименовывания файлов.
Я лично использовал его для исправления имен файлов которые выглядят так:
яковитской Церкви.html
http://wincmd.ru/plugring/Translit.html
Post Reply