Текущий архив: 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