Форум: "Основная";
Текущий архив: 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