Borland har lavet TStringList til at løse dette (og det står vist også i det link som stoney har lagt):
procedure TfrmMain.Button1Click(Sender: TObject); var i, j : integer; Lines : TStringList; Fields : TStringList; begin Lines := TStringList.Create; Fields := TStringList.Create; try Fields.Delimiter := ';'; Lines.LoadFromFile('test.txt'); for i := 0 to Lines.Count - 1 do begin Fields.CommaText := Lines[i]; // Nu er felterne separeret i feltlisten for j := 0 to Fields.Count - 1 do begin // Behandl' liniens felter her case j of 0 : fFornavn := Fields[j]; 1 : fEfternavn := Fields[j]; 2 : fValuta := StrToFloat(Fields[j]); // osv, osv end; end; end; finally Fields.Free; Lines.Free; end; end;
Håber du fandt ud af at bruge de to lister; hvis ikke så kan det efterfølgende være lidt værre... Kom lige til at sidde og nørde lidt med opgaven og resultatet (som ikke er testet, da jeg blev "ramt" af familien igen) er her. Det kunne godt være mere objektorienteret, men til gengæld er det ret funktionelt idet du med en instans af TValutaList kan tilgå felterne helt vilkårligt hvis du skulle ønske det: ValutaList[Linie,Felt]. Ideelt set burde man lave en TValutaData der indeholdt hvert enkelt felt udspecificeret, eksempelvis Valuta, Kurs, Beloeb ...
destructor TValutaList.Destroy; begin try fLines.Free; finally inherited; end; end;
function TValutaList.GetField(const aLine, aField: integer): string; begin result := TStringList(fLines[aLine])[aField]; end;
procedure TValutaList.LoadFromFile(const aFilename: string); var fs : TFileStream; begin fs := TFileStream.Create(aFilename,fmOpenRead or fmShareDenyWrite); try LoadFromStream(fs); finally fs.Free; end; end;
procedure TValutaList.LoadFromStream(aStream: TStream); var i : integer; List : TStringList; Fields : TStringList; begin List := TStringList.Create; try fLines.Clear; List.LoadFromStream(aStream); for i := 0 to List.Count - 1 do begin Fields := TStringList.Create; Fields.Delimiter := ';'; Fields.CommaText := List[i];
fFieldsCount := max(fFieldsCount,Fields.Count); // Registrér max antal felter
procedure TValutaList.SaveToStream(aStream: TStream); var i : integer; begin for i := 0 to fLines.Count - 1 do TStringList(fLines[i]).SaveToStream(aStream); end;
procedure TValutaList.SaveToFile(const aFilename: string); var fs : TFileStream; begin fs := TFileStream.Create(aFilename,fmCreate); try SaveToStream(fs); finally fs.Free; end; end;
end.
Synes godt om
Ny brugerNybegynder
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.