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;
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