Avatar billede ht-delphi Nybegynder
13. december 2003 - 14:52 Der er 1 kommentar og
1 løsning

Betinget søgning og udvælgelse i en tekst fil

Hej,
mit problem er at jeg kun ønsker at kopier fra OLDFILE til NEWFILE hvis MATCHTHIS er mellem START og END i OLDFILE.

Hvordan kan man det?

Den viste kode kan jeg ikke få til at virke.

vh
Harald

var oldfile, newfile: TextFile;
    oldfileline: string;
    storeflag: boolean;
    foundit: boolean;
    selectedtextlist: tstringlist;
    loop:integer;
begin
  assignfile(newfile, 'c:\t\newtextfile.txt');
  rewrite(newfile);

  selectedtextlist := tstringlist.create;

  try
    storeflag:=false;
    assignfile(oldfile,'c:\t\oldtextfile.txt');
    reset(oldfile);
    foundit:=false;

    while not eof(oldfile) do
    begin
      readln(oldfile, oldfileline);
      if (pos('START', oldfileline)=1) then
        storeflag:=true;
      if storeflag then
      begin
        selectedtextlist.add(oldfileline);
        if pos('MATCHTHIS',oldfileline)>0 then
          foundit:=true;
        if (pos('END', oldfileline)=1) then
        begin
          storeflag:=false;
          if foundit then
          begin
            if selectedtextlist.count>0 then
              for loop:=0 to selectedtextlist.count-1 do
              begin
                writeln(newfile,selectedtextlist.strings[loop]);
              end;
            foundit:=false;
          end;
          selectedtextlist.clear;
        end;
      end;
    end;
    closefile(oldfile);

  except
    begin
      showmessage('Soemthing is wrong');
    end;
  end;
  CloseFile(newfile);
  selectedtextlist.free;
end;
Avatar billede ht-delphi Nybegynder
14. december 2003 - 23:22 #1
Nu fik jeg det til at virke.
Skulle ændre =1 til >0.

Harald

PS hvorfan lukker jeg så spørgsmålet?
Avatar billede hrc Mester
15. december 2003 - 11:50 #2
Du laver et svar selv og tildeler de allokerede points (tror jeg nok).

I øvrigt har jeg følgende kommentarer til din procedure:

- TStringList har en SaveToFile som du kan bruge istedet for din for-next.
- Du bør have CloseFile og SelectedTextList..list.Free inde i en try-finally
- Hvad er lettest at læse detteeretlangtogtungtvariabelnavn eller DetteErEtLangtOgTungtVariabelnavn? Synes bedst om den sidste... Brug de store bogstaver (med omtanke). Der er ingen grund til at det ligner noget C'sk ;-)


Har rettet lidt i dit eksempel (funktionaliteten er vist den samme)



var
  oldfile: TextFile;
  st : string;
  StoreFlag: boolean;
  FoundIt: boolean;
  SelectedTextList: TStringList;
begin
  StoreFlag := false;
  FoundIt := false;

  SelectedTextList := TStringList.Create;

  AssignFile(oldfile,'c:\t\oldtextfile.txt');
  Reset(oldfile);
  try
    try
      while not eof(oldfile) do begin
        readln(oldfile, st);
        if pos('START', st) <> 0 then
          StoreFlag := true;

        if StoreFlag then begin
          SelectedTextList.Add(st);

          if pos('MATCHTHIS', st) <> 0 then
            FoundIt := true;

          if (pos('END', st) <> 0) then begin
            StoreFlag := false;

            if FoundIt then begin
              if SelectedTextList.Count > 0 then
                SelectedTextList.SaveToFile('c:\t\newtextfile.txt');
              FoundIt := false;
            end;
            SelectedTextList.Clear;
          end;
        end;
      end; // while
    except
      on e: exception do
        ShowMessage('Something''s wrong'#13#10 + e.Message);
    end; // try
  finally
    CloseFile(oldfile);
    SelectedTextList.free;
  end; // try
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester