Автор Тема: Извлечение текстовых данных из формата RTF(raw)  (Прочитано 1980 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 943
  • Репутация: 203
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Доброго времени суток.

Требуется извлекать только текстовые данные из RTF(raw), пример:
События А1…Аn не могут быть случаями, если они
События А…Ане могут быть случаями, если они
{\rtf1\ansi\ansicpg1251\deff0{\fonttbl{\f0\froman\fprq2\fcharset204{\*\fname Times New Roman;}Times New Roman CYR;}}
\viewkind4\uc1\pard\lang1049\f0\fs28\'d1\'ee\'e1\'fb\'f2\'e8\'ff \i\'c0\sub 1\nosupersub\'85\'c0\lang1033\sub n\lang1049\nosupersub\i0  \'ed\'e5 \'ec\'ee\'e3\'f3\'f2 \'e1\'fb\'f2\'fc \'f1\'eb\'f3\'f7\'e0\'ff\'ec\'e8, \'e5\'f1\'eb\'e8 \'ee\'ed\'e8 \par
}
Строка 1: Требуемый результат
Строка 2: Текущий результат ( не верный )
Далее >: RTF(raw)

В спешке написал следующую функцию, но ее недостаточно (возвращает данные вида Строка 2):
Код: AutoIt [Выделить]
Func _RtfToStr( $sRtf_raw )
    Local $aExp, $sRet, $Idx
    ; ---
    $aExp = StringRegExp( $sRtf_raw, "\'([^\\]+)\\", 3, StringInStr( $sRtf_raw, "\fs28\" ) )
    For $Idx = 0 To UBound( $aExp ) - 1 Step 1
        If StringRegExp( $aExp[$Idx], '^[0-9a-f]{2}' ) Then
            $sRet &= BinaryToString( "0x" & StringLeft( $aExp[$Idx], 2 ) ) & StringTrimLeft( $aExp[$Idx], 2 )
        Else
            $sRet &= $aExp[$Idx]
        EndIf
    Next
    Return StringRegExpReplace( $sRet, "(\\|[\r\n]*)", "" )
EndFunc


Ранее я не сталкивался лоб в лоб с этим форматом... и разбираться сейчас в нем нет ни времени, ни желания. Может у кого есть наработки? Заранее благодарю.

Русское сообщество AutoIt

Извлечение текстовых данных из формата RTF(raw)
« Отправлен: Декабрь 24, 2014, 17:01:01 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
Откройте в WordPad'е "сырой" rtf и заберите чистый текст.
Код: AutoIt [Выделить]
$FileName = "raw.rtf"
Run(@ProgramFilesDir & "\Windows NT\Accessories\wordpad.exe " & @ScriptDir & "\" & $FileName)
$Text = ControlGetText(WinWaitActive($FileName), "", "RICHEDIT50W1")
WinClose($FileName)
ConsoleWrite($Text & @CRLF)

« Последнее редактирование: Декабрь 24, 2014, 17:34:26 от InnI »

Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 943

  • Автор темы
  • Репутация: 203
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
InnI
Боюсь это невозможно. Исходного текста слишком много ( весь в RTF, местами подключены изображения ), более того - он упакован ( расшифровывается в процессе работы программы ). На вход поступает маска, исходя из которой нужно найти связанное содержимое.

Не вариант в процессе поиска открывать >1к строк в WordPad'е. Нужно именно извлечение текстовых данных.

Русское сообщество AutoIt

Re: Извлечение текстовых данных из формата RTF(raw)
« Ответ #2 Отправлен: Декабрь 24, 2014, 17:35:29 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0

Оффлайн edyapd [?]

  • Осваивающий
  • **
  • Сообщений: 380
  • Репутация: 30
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
$aExp = StringRegExp( $sRtf_raw, "\'([^\\]+)\\|sub (.+?)\\|([ ])\\", 3, StringInStr( $sRtf_raw, "\fs28\" ) )

Но не факт, что это ещё на чём-нибудь не вспоткнётся.

Русское сообщество AutoIt

Re: Извлечение текстовых данных из формата RTF(raw)
« Ответ #4 Отправлен: Декабрь 24, 2014, 18:21:37 »

Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 943

  • Автор темы
  • Репутация: 203
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
InnI
Как раз только прочитал ту тему.

Маска генерируется из другого RichEdit. Ранее я получал текст через WM_GETTEXT ( ибо для реализации StreamToVar(внешнее приложение )) придется изрядно попотеть. Теперь:

Ctrl+A
Ctrl+C
Код: AutoIt [Выделить]
Func _PetsPwned_GetRtfRaw()
    If Not _ClipBoard_Open(0) Then _
        Return 0

    Local $iFormat, $hMemory, $pBuffer, $iBufSize, $tData, $sRet
    ; ---
    $iFormat = _ClipBoard_RegisterFormat("Rich Text Format")
    $hMemory = _ClipBoard_GetDataEx($iFormat)
    Do
        If Not $hMemory Then _
            ExitLoop

        $pBuffer = _MemGlobalLock($hMemory)
        If Not $pBuffer Then _
            ExitLoop
        ; *
        $iBufSize = _MemGlobalSize($hMemory)
        If $iBufSize Then
            $tData = DllStructCreate( "char Buf[" & $iBufSize & "]", $pBuffer )
            $sRet = $tData.Buf
        EndIf

        _MemGlobalUnlock($hMemory)
    Until True
    _ClipBoard_Close()
    ; ---
    Return $sRet
EndFunc


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

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 963
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm1 = GUICreate("", 320, 165, -1, -1)
$hRichEdit = _GUICtrlRichEdit_Create($hForm1, "", 10, 10, 300, 100, _
            BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
$iButton = GUICtrlCreateButton("Open", 235, 130, 75, 25)
GUISetState()

While 1
   $iMsg = GUIGetMsg()
   Switch $iMsg
      Case $GUI_EVENT_CLOSE
         GUIDelete()
         Exit
      Case $iButton
         _GUICtrlRichEdit_SetText($hRichEdit, "")
         _GUICtrlRichEdit_StreamFromFile($hRichEdit, @ScriptDir &"\18571.rtf")
         ConsoleWrite(StringStripWS(_GUICtrlRichEdit_GetText($hRichEdit),3) & @CR)
   EndSwitch
WEnd



Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Декабрь 24, 2014, 18:54:40 от Garrett »

Скорблю и помню.




Русское сообщество AutoIt

Re: Извлечение текстовых данных из формата RTF(raw)
« Ответ #6 Отправлен: Декабрь 24, 2014, 18:44:33 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
7 Ответов
5079 Просмотров
Последний ответ Июль 25, 2010, 16:59:28
от f4llen
1 Ответов
1161 Просмотров
Последний ответ Июль 21, 2015, 18:51:01
от madmasles
1 Ответов
2392 Просмотров
Последний ответ Август 22, 2015, 12:17:11
от madmasles
0 Ответов
2073 Просмотров
Последний ответ Август 22, 2015, 12:12:40
от madmasles
0 Ответов
685 Просмотров
Последний ответ Сентябрь 01, 2015, 09:41:11
от madmasles
2 Ответов
1271 Просмотров
Последний ответ Октябрь 15, 2015, 19:39:32
от veretragna
0 Ответов
341 Просмотров
Последний ответ Август 26, 2017, 13:27:34
от TpeTTep
1 Ответов
706 Просмотров
Последний ответ Октябрь 07, 2017, 15:19:30
от Tempo
2 Ответов
559 Просмотров
Последний ответ Январь 11, 2018, 07:11:05
от Boris
2 Ответов
1337 Просмотров
Последний ответ Сентябрь 01, 2018, 04:18:55
от Murikipak