Импорт текстов в базу из массива файлов doc и docx
Модератор: Модераторы
Импорт текстов в базу из массива файлов doc и docx
Здравствуйте.
Имеется большое количество файлов (протоколы врачей) в формате docx и doc
Структура внутри простая, ненужная картинка эмблема, заголовок и текст, размер 1-2 страницы
Сохраняли давно поэтому есть и doc (Word 2003-XP) и docx(Word 2007+)
Можно использововать MS Office или LibreOffice
Задача вгрузить тексты в базу данных. Минимум получается 2 поля путь+имя файла и сам текст со всеми переносами, пробелами, табами (нумерации и спец разметки там нет)
Покопался тут и погуглил, все темы в основном старые и мало подробностей.
Получается алгоритм такой
1. Перебор в цикле и ли рекурсией папок подпапок с файлами.
2. Запуск/открытие Офиса с подачей в него очередного файла.
3. Получение текста из активного документа.
4. сохранение в базу (разбор и исправление огрех, вопрос не стоит, это второй этап)
пункт 3. не смог найти как реализовать.
Подскажите пожалуйста, кто знает.
Имеется большое количество файлов (протоколы врачей) в формате docx и doc
Структура внутри простая, ненужная картинка эмблема, заголовок и текст, размер 1-2 страницы
Сохраняли давно поэтому есть и doc (Word 2003-XP) и docx(Word 2007+)
Можно использововать MS Office или LibreOffice
Задача вгрузить тексты в базу данных. Минимум получается 2 поля путь+имя файла и сам текст со всеми переносами, пробелами, табами (нумерации и спец разметки там нет)
Покопался тут и погуглил, все темы в основном старые и мало подробностей.
Получается алгоритм такой
1. Перебор в цикле и ли рекурсией папок подпапок с файлами.
2. Запуск/открытие Офиса с подачей в него очередного файла.
3. Получение текста из активного документа.
4. сохранение в базу (разбор и исправление огрех, вопрос не стоит, это второй этап)
пункт 3. не смог найти как реализовать.
Подскажите пожалуйста, кто знает.
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
В Делфи есть платный компонент для чтения вордовских файлов, а в лазаре скорее всего придется сначала делать конвейер для конвертации docx и doc в odt через LibreOffice, а потом парсить этот odt, я этим не занимался. но встречал, что odt имеет структуру xml.
Так и docx имеет структуру XMLСнег Север писал(а):что odt имеет структуру xml.
Только не имеет смысл что-то во что-то конвертировать, если удастся подключиться к sWrite как к OLE объекту и тянуть тест оттуда.
jsa, docx - это xml в zip архиве. Парсить можно, но сложно ввиду сложной с структуры, с doc всё еще сложнее.
В одном из проектом пришли к простому, но эффективному решению. Документы (doc/docx) конвертируются в html с помощью LibreOffice (soffice --headless --convert-to html:HTML %filename%). Полученный html уже прекрасно парсится (для freepascal с помощью SaxHtml или FastHtmlParser, например)
В результате как раз получите "сам текст со всеми переносами, пробелами, табами " который можно будет забирать в базу как есть.
В одном из проектом пришли к простому, но эффективному решению. Документы (doc/docx) конвертируются в html с помощью LibreOffice (soffice --headless --convert-to html:HTML %filename%). Полученный html уже прекрасно парсится (для freepascal с помощью SaxHtml или FastHtmlParser, например)
А в вашем случае, раз нет никакой сложной структуры типа таблиц вообще можно конвертировать в txtjsa писал(а):Задача вгрузить тексты в базу данных. Минимум получается 2 поля путь+имя файла и сам текст со всеми переносами, пробелами, табами (нумерации и спец разметки там нет)
Код: Выделить всё
soffice --headless --convert-to txt:Text %filename%Вот это поворот!!! Спасибо! погуглю попробую.
Добавлено спустя 1 минуту 13 секунд:
%filename% в случае примеров это входной или выходной файл?
Если входной то куда выход? и наоборот?
Добавлено спустя 1 минуту 13 секунд:
%filename% в случае примеров это входной или выходной файл?
Если входной то куда выход? и наоборот?
Код: Выделить всё
function PrepareFile(FileName: string): string;
const
wdFormatText = 2;
wdExportFormatPDF = 17;
wdExportFormatXPS = 18;
wdExportOptimizeForPrint = 0;
wdExportOptimizeForOnScreen = 1;
wdExportAllDocument = 0;
wdExportCurrentPage = 2;
wdExportFromTo = 3;
wdExportSelection = 1;
wdDoNotSaveChanges = 0;
var
WordApp: OleVariant;
wd: OleVariant;
procedure wdInit(UseActiveObject: Boolean);
begin
WordApp := Unassigned;
if not UseActiveObject then
WordApp := CreateOleObject('Word.Application')
else
try
WordApp := GetActiveOleObject('Word.Application');
except
WordApp := CreateOleObject('Word.Application');
end;
end;
begin
wdInit(true);
wd:= WordApp.Documents.Open(FileName);
wd.Activate;
result:= ChangeFileExt(FileName, '.txt');
// wd.ExportAsFixedFormat(result, wdExportFormatPDF, false, wdExportOptimizeForPrint, wdExportAllDocument);
wd.SaveAs(result, wdFormatText);
wd.Close(wdDoNotSaveChanges);
end; как то надо было в pdf сохранять
переделал код на текст, не проверял
Добавлено спустя 1 минуту 16 секунд:
+uses Variants, ComObj
Спасибо, рассматривал уже имеющиеся примеры через Word.Application
но решил сначала тему с LibreOffice до изучать.
Работает!
отрабатывает отлично и создает одноименный txt файл рядом.
Просмотрю или такой вариант или в HTML с разбором последующим.
Всем спасибо, особенно WAYFARER.
Да причинится тебе успех, удача и прочая сбыча мечт.
но решил сначала тему с LibreOffice до изучать.
Работает!
Код: Выделить всё
"C:\Program Files\LibreOffice\program\soffice" --headless --convert-to txt:Text "D:\test\ПротоколТест.docx" Просмотрю или такой вариант или в HTML с разбором последующим.
Всем спасибо, особенно WAYFARER.
Да причинится тебе успех, удача и прочая сбыча мечт.
Это входной. Выходной будет по тому же пути с тем же именем, но другим расширением. Если нужно положить выходной файл куда то отдельно то нужно использовать опцию --outdirjsa писал(а):%filename% в случае примеров это входной или выходной файл?
Набросал утилиту сделал конвертацию у себя на рабочем месте.
Перетащил на целевой комп, а там конвертация не работает.
в CMD запускаю
получаю ошибку
Сколько ошибку не гуглил, не нашел ответа что с этим делать. Был вариант что прав нет на папку. но всё что могли выдали, и папки разные попробовали.
Сталкивались с таким?
Перетащил на целевой комп, а там конвертация не работает.
в CMD запускаю
Код: Выделить всё
"C:\Program Files\LibreOffice\program\soffice" --headless --convert-to txt:TEXT "C:\tmp\123.docx"получаю ошибку
Код: Выделить всё
convert C:\tmp\123.docx as a Writer document -> C:\tmp\123.txt using filter : TEXT
Error: Please verify input parameters... (SfxBaseModel::impl_store <file:///C:/tmp/123.txt> failed: 0x81a(Error Area:Io Class:Parameter Code:26) at C:/cygwin64/home/buildslave/source/libo-core/sfx2/source/doc/sfxbasemodel.cxx:3272 at C:/cygwin64/home/buildslave/source/libo-core/sfx2/source/doc/sfxbasemodel.cxx:1822)
Сколько ошибку не гуглил, не нашел ответа что с этим делать. Был вариант что прав нет на папку. но всё что могли выдали, и папки разные попробовали.
Сталкивались с таким?
попробовал, ровно тоже самое.RRYTY писал(а):Попробуйте
Емнип в винде до OO можно было достучаться через COM, что-нибудь вроде
Может оказаться, что всё ещё актуально?
Код: Выделить всё
function OoGetText(const aFileName: string; out aErr: string): TStringList;
var
Manager: Variant;
function CreateProp(const aName: string; const aValue: Variant): Variant;
begin
Result := Manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
Result.Name := aName;
Result.Value := aValue;
end;
var
App, Params, Doc: Variant;
Url: string;
begin
Result := nil;
try
Manager := CreateOleObject('com.sun.star.ServiceManager');
except
on e: Exception do begin
aErr := Format('%s: "%s"', [e.ClassName, e.Message]);
exit;
end;
end;
App := Manager.CreateInstance('com.sun.star.frame.Desktop');
Url := 'file:///' + aFileName;
Params := VarArrayOf([CreateProp('Hidden', True), CreateProp('ReadOnly', True)]);
try
Doc := App.LoadComponentFromUrl(Url, '_blank', 0, Params);
except
on e: Exception do begin
aErr := Format('%s: "%s"', [e.ClassName, e.Message]);
exit;
end;
end;
Result := TStringList.Create;
Result.Text := Doc.Text.&String;
end;
Значит, не пробовали. Портируемая версия не использует никаких cygwin. И исполняемый файл другой.jsa писал(а):ровно тоже самое
Добавлено спустя 8 минут 15 секунд:
Какой именно?RRYTY писал(а):И исполняемый файл другой.
quote="jsa"]Какой именно?[/quote]
Кто ж его знает. Но вот так сработало. Ваш-то файл открывается в принципе?
Кто ж его знает. Но вот так сработало. Ваш-то файл открывается в принципе?
