Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Извлечение слов из MS Word [D6, WinXP]


Pavelkq ©   (2004-06-29 07:25:00) 

Здравствуйте! Пишу программу обработки текстов. Предполагается, что все входящие тексты имеют формат MS Word.
Не зависимо от метода открытия файла (нашел их 3 штуки), не знаю как получить последовательно все слова. Вернее знаю:

       for i1:=1 to WordApp.ActiveDocument.Words.Count do
       begin
       Temp:=WordApp.ActiveDocument.Words.Item(i1);
       end;

Все чудно работает, НОэта функция каждый раз пробегает к i-му слову от начала. Выходит, что первые слова извлекаются мгновенно, последние - несколько секунд. Файл 100К просто зависает на 70%.
 Можно, конечно сделать:

  Document:=WordApp.Documents.Open(AWordDoc);
  Temp:=Document.range;

а потом сделать анализ точек, запятых и прочих символов, чтобы отделить слова. Но хотелось бы чтобы этот анализ точно совпал с анализом MS Word, т.е. если я скажу
 WordApp.ActiveDocument.Words.Item(1000).select;
то выделилось бы тоже самое, что если я выделю тысячное слово при собственном методе разбора.
 Вопрос, собственно состоит в том, чтобы отыскать уже готовые наработки в этой области. Т.к. я уже пару дней убил на повторение алгоритма Ворда и пока безуспешно. Может у Ворда поюзать какую-то другую функцию? Моежт создать модуль на Бейсике вплоть до передачи базы слов через внешний файл. Любые методы пойдут, лишь бы быстро!


Pavelkq   (2004-07-01 12:04:00) [1]

Спасибо, Vertal, но это демонстрация самого цикла. Мне же важно получить каждое слово последовательно в переменную типа string. Больше ничего. Поэтому я потратил еще два дня и, проанализировав всяческие варианты алгоритма Ворда, написал юнит, который способен аналогично ворду разбить входной текст на отдельные слова, разделенные символом #13, что потом идеально забрасывается в TStringList. Могу выставить этот юнит на обозрение, но не знаю куда.


vertal   (2004-06-29 13:43:00) [2]

Я несколько поторопился с предыдущим постом , вот исправленный варианет цикла:

CurWord := MSWord.ActiveDocument.Range.Words(1)  ;
Total:=MSWord.ActiveDocument.Range.End;
While CurWord.End<>Total do
Begin
 ...
 CurWord:=CurWord.Next(Unit:=wdWord,Count:=1);
end;


vertal   (2004-06-29 13:24:00) [3]

Microsoft рекомендует перебирать коллекции в VBA ( в частности , данную коллекцию слов) , либо в цикле примерно таком:

For Each Word in AllWords
  ...
Next Each

, но в Delphi это не покатит , либо примерно так:

CurWord := MSWord.ActiveDocument.Range.Words(1)  ;
While Not CurWord.Last do
Begin
 ...
 CurWord:=CurWord.Next;
end;

Попробуйте применить второй вариант цикла


YurikGL   (2004-06-29 07:49:00) [4]

1) Можно пользоваться методом find и findnext если известно какое слово мы ищем.
2) Использовать wordapplication.visible:=false на момент обработки документа.

Пиши что конкретно надо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо