Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

Кодировка что ли?   Найти похожие ветки 

 
Pavelkq   (2004-12-23 13:23) [0]

Пишу программу обработки большого количества вордовских файлов. Точнее все нужно вынуть их свойства. Сделал это через создание объекта word.application и потом уже нужные свойства выбираю. Но файлов 1500. Поэтому процедура открытия и закрытия файлов занимает очень много времени. Посмотрел вьювером и увидел, что свойства можно (наверное) получить прямо из файла, как текстогово.

procedure TForm1.Button1Click(Sender: TObject);
var name: string;
   F: textfile;
   s: string;
   i: integer;
begin
if Form1.OpenDialog1.Execute then
 name := OpenDialog1.FileName;
 AssignFile(F, name);
 Reset(F);
 while not eof(F) do
 begin
   Readln (F,s);
   for i:=1 to length(s) do
   if copy(s,i,8)="Тестовый" then
     Memo1.Lines.Add(s);
 end;
 CloseFile(f);
end;

Слово Тестовый - это название документа в свойствах. После выполнения в Меме1 чисто. Зато, если прошу просто вывести в Мему все подряд, то это слово там отображается в нормальной кодировке.
 Во вьювере вижу его, как ANSI.
 А написал эту процедуру для того, чтобы методом тыка, открыв несколько файлов, выявить закономерность, которая предшествует каждому свойству. Тогда, потом смогу испльзую эти последовательности находить нужные свойства во всех файлах.


 
wild_arg   (2004-12-23 13:31) [1]

Мне кажется все строки в вордовских файлах хранятся в UNICODE. Что у тебя за вьювер? может он просто преобразовывает юникод в стандартный вид и все.


 
Pavelkq   (2004-12-23 13:37) [2]

Фиг его знает. Мне хоть уникоды, как их понять в Дельфях? А вьювер от ДискоКомандира.


 
wild_arg   (2004-12-23 15:30) [3]

В .doc строки храняться в юникоде. Лучше искать с помощью ф-ции AnsiStrPos (не спрашивайте, почему у нее приставка Ansi, а предназначена она для многобайтных кодировок. Не я называл:)


 
Pavelkq   (2004-12-24 07:46) [4]

Сделал

procedure TForm1.Button1Click(Sender: TObject);
var name: string;
   f: textFile;
   s,s1: string;
   i: integer;
begin
if Form1.OpenDialog1.Execute then
 name := OpenDialog1.FileName;
 AssignFile(F, name);
 Reset(F);
 while not eof(f) do
 begin
   Readln (F,s);
   s1:= AnsiStrPos(@s,"Òåñòîâûé");
   Memo1.lines.Add(s1);
 end;
 CloseFile(f);
end;

Не прокатило. Т.е. в меме чисто.


 
Pavelkq   (2004-12-24 07:50) [5]

Читал о преобразовании String в PChar и вижу там фишку, что в конце переменной типа String добавляют знак #0 (это наверное конец) Но весь прикол в том, что весь мой string на 90% состоит из #0. Что делать?
... там в коде
s1:= AnsiStrPos(@s,"Тестовый"); написано.


 
Pavelkq   (2004-12-24 09:43) [6]

Вот еще одну штуку нашел прикольную. Оказывается
copy(s,i,1) не то же самое, что s[i].
И все же, как научить Дельфи понимать вордовские файлы?
Если прошу вывести в мему строку "Тестовый", выводит, а если #0+"Тестовый", ничего не выводит.


 
ЮЮ ©   (2004-12-24 09:49) [7]

>Если прошу вывести в мему строку "Тестовый", выводит, а если #0+"Тестовый", ничего не выводит.

Так это не Дельфи виновата, string отлично "держит" эту комбинацию, а Windows, в API которой повсюду PChar, а #0 - по определению - интерпретируется как конец строки


 
Pavelkq   (2004-12-24 09:52) [8]

Я как раз об этом догадался. И еще раз взываю к помощи, как корректно читать/писать подобные строки в Дельфи?


 
ЮЮ ©   (2004-12-24 09:54) [9]

Caption := #0"aaa";
и заголовка нету, но
Caption := IntToStr(Pos("aaa", #0"aaa"));
 покажет, что строка-то не пустая


 
Pavelkq   (2004-12-24 09:56) [10]

Это уже что-то, но очень неявно. Мне-то надо конкретно найти поля свойств и, при необходимости, изменить их.


 
ЮЮ ©   (2004-12-24 09:57) [11]

первое (и главное) - не использовать ReadLn - это только для по-настоящему текстовых файлов


 
Pavelkq   (2004-12-24 10:00) [12]

Опа, я перешел на Дельфи с Бейсика и других методов не знаю. Подскажите, плиз.


 
Pavelkq   (2004-12-24 13:39) [13]

Скажите хоть, где почить об этом на русском?
 Или есть другие варианты вытаскивания свойств? Неужели никто еще не писал модуля для открытия вордовских файлов без самого ворда?


 
К-101   (2004-12-24 16:13) [14]

Загрузи файл *.doc в TMemoryStream
Заведи переменную типа PWideChar
Переведи искомый текст в Unicod через StringToWideChar()
Просматривая весь поток как массив сравнивай посимвольно.


 
К-101   (2004-12-24 16:30) [15]

function FindText(S,FileName:string; ): Boolean;
var
 MStream:  TMemoryStream;
 SubLen,I: Integer;
 PSubTxt:  PWideChar;
begin
 Result := False;
 MStream := TMemoryStream.Create;
 SubLen := Length(S);
 GetMem(PSubTxt,2 * SubLen + 1);
 try
   PSubTxt := StringToWideChar(S,PSubTxt,2 * SubLen);
   MStream.LoadFromFile(FileName);
   // FindTextInStream(var SubS,S: PWideChar) - самописная
   Result := FindTextInStream(PSubTxT,PWideChar(MStream.Memory))
 finally
   MSteram.Clear;
   MStream.Free
   FreeMem(PSubTxt);
 end;
end;



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

Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.049 c
3-1103016178
HDM
2004-12-14 12:22
2005.01.16
ПОИСК ПО БАЗЕ


1-1104171259
AndreyK_
2004-12-27 21:14
2005.01.16
Создание пароля


3-1102404457
GekaNaz
2004-12-07 10:27
2005.01.16
Проблема дисконнекта в InterBase6.5


4-1101734555
dima_shapkin
2004-11-29 16:22
2005.01.16
Edit


1-1104724930
Konstantin
2005-01-03 07:02
2005.01.16
Открыть файл моим приложением





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский