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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.198 c
1-1104623105
Тем
2005-01-02 02:45
2005.01.16
Как получить список всех ресурсов программы с их типами ?


14-1104022330
Johnmen
2004-12-26 03:52
2005.01.16
Открытое письмо


1-1104023591
Narik
2004-12-26 04:13
2005.01.16
Inifiles


1-1104414690
R.O.O.T
2004-12-30 16:51
2005.01.16
Помогите почему происходит следующее


3-1103006883
OlegL
2004-12-14 09:48
2005.01.16
TMemoField