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

Вниз

Поиск фрагмента текста...   Найти похожие ветки 

 
Андрей С.   (2006-09-24 13:57) [0]

Здравствуйте, уважаемые форумчане!
Хочу обратиться к вам за помощью вот по какому вопросу...

Задача состоит в том, чтобы программа, так сказать, автоматически редактировала все файлы с расширением .html в текущей папке. Только не просто редактировала, а искала заранее определённую пользователем строчку (фиксированный фрагмент текста длинной в одну строчку), после чего всё, что идёт до него, включая эту строчку, удаляла из файла. Затем ищется вторая строчка (которая также заранее указывается пользователем) и всё, что идёт ПОСЛЕ неё, включая её саму, удаляется.
Т.е. на примере что-то вроде того:

файл example.html:

111111111111
222222222222
na4alo-na4alo
aaaaaaa
bbbbbbb
ccccccc
konec-konec
333333333333
444444444444

и программа должна из всего этого файла оставить только:

aaaaaaa
bbbbbbb
ccccccc

Понимаете?
Я пробовал сделать это, используя RichEdit, но много мороки, очень долгая работа программы и вообще :) Честно говоря, я в Delphi ещё зелёный, поэтому и пришёл на этот форум за помощью.
Для вас это наверно очень простая задачка, поэтому, если не трудно, помогите пожалуйста кодом. Чтобы можно было нажать на кнопку и программа из той папки, в которой она находится, повырезает вышесказанным образом куски текста из html-файлом и сохранит их в простой .txt, но с именами тех html-файлов.
P.S. Количество html-файлов в папке с программой может быть неограничено.
Заранее спасибо!


 
Zeqfreed ©   (2006-09-24 14:26) [1]

function TrimFiles(FileList : TStrings; StartPattern, EndPattern, OutputExt : ShortString) : Integer;
var
 i, j, sIdx, eIdx : Integer;
begin
 Result := 0;
 if not Assigned(FileList) then Exit;

 with TStringList.Create() do begin
  try
   for i := 0 to FileList.Count - 1 do begin
    LoadFromFile(FileList[i]);
    sIdx := IndexOf(StartPattern);
    eIdx := IndexOf(EndPattern);
    sIdx := Max(sIdx, 0);
    if (eIdx = -1) then eIdx := Count - 1;

    if (eIdx - sIdx > 0) then begin
     for j := 0 to sIdx do Delete(j);
     for j := eIdx to Count - 1 do Delete(j);
     SaveToFile(ChangeFileExt(FileList[i], OutputExt));

     if (sIdx > 0) and (eIdx < Count - 1) then
      Result := Result + 1;
    end;
   end;
  finally
   Free;
  end;
 end;
end;


Работоспособность пока не проверял.


 
Zeqfreed ©   (2006-09-24 14:49) [2]

function TrimFiles(FileList : TStrings; StartPattern, EndPattern, OutputExt : ShortString) : Integer;
var
 i, j, sIdx, eIdx : Integer;
begin
 Result := 0;
 if not Assigned(FileList) then Exit;

 with TStringList.Create() do begin
  try
   for i := 0 to FileList.Count - 1 do begin
    LoadFromFile(FileList[i]);
    sIdx := IndexOf(StartPattern);
    eIdx := IndexOf(EndPattern);
    if (eIdx = -1) then eIdx := Count;

    if (eIdx - sIdx > 0) then begin
     if (sIdx > -1) and (eIdx < Count - 1) then Result := Result + 1;

     for j := eIdx to Count - 1 do Delete(eIdx);
     for j := 0 to sIdx do Delete(0);

     SaveToFile(ChangeFileExt(FileList[i], OutputExt));
    end;
   end;
  finally
   Free;
  end;
 end;
end;


Отладил :)
Таки сразу не сообразил о тонкостях удаления :)


 
Андрей С.   (2006-09-24 15:21) [3]

Пишу так:

procedure TForm1.Button1Click(Sender: TObject);
begin
TrimFiles(RichEdit1.Lines,"начальный фрагмент","конечный фрагмент",".txt");
end;

но в итоге в выходной файл попадает всё то же самое, что и было в обрабатываемым. Т.е. ничего не удаляется :(


 
Ketmar ©   (2006-09-24 15:25) [4]

>[3] Андрей С. 24-Sep-2006, 15:21
немедленно в магазин. хозтоваров. за метлой.


 
Furyz ©   (2006-09-24 15:29) [5]

> TrimFiles(RichEdit1.Lines,"начальный фрагмент","конечный
> фрагмент",".txt");

ты передаеш не тот параметр


 
Zeqfreed ©   (2006-09-24 15:33) [6]

> [3] Андрей С.   (24.09.06 15:21)

Содержимое файла в студию :)


 
Андрей С.   (2006-09-24 16:18) [7]

Вот, к примеру, такой html-файл:

<HTML>
<HEAD>
<TITLE>Какой-то там заголовок</TITLE>

<теги теги теги: "теги-теги-теги">
<теги те2ги теги: "теги-теги-теги">
<теги 1теги теги: "теги-теги-теги">
<теги теdги теги: "теги-теги-теги">
<теги тег1и теги: "теги-теги-теги">

<теги тег1и теги: "../../../теги-теги-теги.тег">
</HEAD>
<BODY>
<IMG src="../../../test/test.gif" width=120 height=140> <FONT size="5">START SAMPLE</FONT><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. Вот это надо оставить. <IMG src="../../../test/test.gif" width=120 height=140><br><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
<IMG src="../../../test/test.gif" width=120 height=140><br>
<br><br>

<IMG src="../../../test/test.gif" width=120 height=140> <FONT size="5">END SAMPLE</FONT><br><br>
<теги теги теги: "теги-теги-теги">
<теги те2ги теги: "теги-теги-теги">
<теги 1теги теги: "теги-теги-теги">
<теги теdги теги: "теги-теги-теги">
<теги тег1и теги: "теги-теги-теги">

<теги тег1и теги: "../../../теги-теги-теги.тег">

</BODY>
</HTML>

Начальной строкой здесь считаю: <FONT size="5">START SAMPLE</FONT><br><br>
Конечной: <FONT size="5">END SAMPLE</FONT><br><br>

На выходе получается точно такой же файл. Один в один :(


 
Андрей С.   (2006-09-24 16:19) [8]

Там "START SAMPLE" и "END SAMPLE" с обоих сторон заключены в тег [b],[/b] ;)


 
Zeqfreed ©   (2006-09-24 16:36) [9]

> [7] Андрей С.   (24.09.06 16:18)


> Начальной строкой здесь считаю: <FONT size="5">START SAMPLE</FONT><br><br
> >
> Конечной: <FONT size="5">END SAMPLE</FONT><br><br>

К сожалению, все остальные, включая TStringList, считают это подстрокой.


 
Андрей С.   (2006-09-24 16:37) [10]

Т.е.? Значит, работать не будет? :*(


 
Zeqfreed ©   (2006-09-24 16:42) [11]

> [10] Андрей С.   (24.09.06 16:37)

Значит нужно выбрать одно из решений:
а) Задавать в качестве шаблона строки действительно целую строку, а не её подстроку
б) Вынести подстроку на отдельную строку в файлах
в) Изменить логику выбора строки
г) …

Если честно, я бы работал с такими файлами несколько по-другому, а именно: загружал бы их в память посредством MapViewOfFile, затем совершал бы поиск шаблонных вхождений и копировал нужную часть в новый файл. Это, пожалуй, одно из наиболее производительных решений.


 
SergP ©   (2006-09-24 17:52) [12]

По идее такое должно работать. Только внешний цикл для перебирания файлов сам пиши...


procedure X(filename,StartPattern, EndPattern:string);
var
 s:string;
 k:integer;
begin
with TFileStream.Create(filename, fmOpenReadWrite) do
  try
    SetLength(s,Size);
    ReadBuffer(Pointer(s)^, Size);
    k:=pos(StartPattern,s);
    if k>0 then delete(s,1,length(StartPattern)+k-1);
    k:=pos(EndPattern,s);
    if k>0 then SetLength(s,k-1);
    size:=0;
    Position:=0;
    WriteBuffer(pointer(s)^,length(s));
  finally
    free;
  end;
end;


 
SergP ©   (2006-09-24 18:31) [13]


procedure TrimFile(filename,StartPattern, EndPattern:string);
var
 s:string;
 k:integer;
begin
with TFileStream.Create(filename, fmOpenReadWrite) do
  try
    SetLength(s,Size);
    ReadBuffer(Pointer(s)^, Size);
    k:=pos(StartPattern,s);
    if k>0 then delete(s,1,length(StartPattern)+k-1);
    k:=pos(EndPattern,s);
    if k>0 then SetLength(s,k-1);
    size:=0;
    Position:=0;
    WriteBuffer(pointer(s)^,length(s));
  finally
    free;
  end;
end;

procedure TrimFilesOfDir(Dir,mask,StartPattern,EndPattern:string);
var
 srec:TSearchRec;
begin
 if FindFirst(Dir+mask, faAnyFile - faDirectory, SRec) = 0 then
   repeat
      TrimFile(Dir+SRec.name,StartPattern,EndPattern);
   until FindNext(SRec) <> 0;
 FindClose(SRec);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TrimFilesOfDir("c:\mojapapka","*.html","na4alo-na4alo","konec-konec");
end;


 
SergP ©   (2006-09-24 18:33) [14]

Ошибся немного...

procedure TForm1.Button1Click(Sender: TObject);
begin
TrimFilesOfDir("c:\mojapapka\","*.html","na4alo-na4alo","konec-konec");
end;


 
Андрей С.   (2006-09-25 08:44) [15]

Пасибочки ;)



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

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

Наверх





Память: 0.5 MB
Время: 0.319 c
15-1158205348
PSPF2003
2006-09-14 07:42
2006.10.08
Какой Linux?


11-1133802855
Zoom
2005-12-05 20:14
2006.10.08
KOLHighlightEdit пара вопросов


3-1154774759
wild_arg
2006-08-05 14:45
2006.10.08
Access, ADO, Delphi и шифрация


15-1158323292
Real
2006-09-15 16:28
2006.10.08
Чем лучше печатать исходники?


2-1158589894
SamProf
2006-09-18 18:31
2006.10.08
Работа с BAT файлами





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский