![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Извлечение слов из 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 на момент обработки документа.
Пиши что конкретно надо.