Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Извлечение слов из MS Word   Найти похожие ветки 

 
Pavelkq   (2004-06-29 07:25) [0]

Здравствуйте! Пишу программу обработки текстов. Предполагается, что все входящие тексты имеют формат 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;
то выделилось бы тоже самое, что если я выделю тысячное слово при собственном методе разбора.
 Вопрос, собственно состоит в том, чтобы отыскать уже готовые наработки в этой области. Т.к. я уже пару дней убил на повторение алгоритма Ворда и пока безуспешно. Может у Ворда поюзать какую-то другую функцию? Моежт создать модуль на Бейсике вплоть до передачи базы слов через внешний файл. Любые методы пойдут, лишь бы быстро!


 
YurikGL ©   (2004-06-29 07:49) [1]

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

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


 
vertal ©   (2004-06-29 13:24) [2]

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;

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


 
vertal ©   (2004-06-29 13:43) [3]

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

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;


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.056 c
4-1086525564
Islander
2004-06-06 16:39
2004.07.18
Хендл окна, висящего поверх других на экране и не активного


1-1089033655
wild_arg
2004-07-05 17:20
2004.07.18
навигация по TXMLDocument


14-1088579087
oleg_krechetov
2004-06-30 11:04
2004.07.18
Сдача ВКР


1-1088777611
VasRog
2004-07-02 18:13
2004.07.18
Строка из массива символов


1-1089026900
MyName
2004-07-05 15:28
2004.07.18
SAVEKEY