Avatar billede ingeman Seniormester
17. juni 2006 - 14:40 Der er 3 kommentarer og
1 løsning

Læse kolon separeret fil

jeg har en fil der indeholder følgende:

14422568;DKK;25467.21;0;0;0;

Mangler function/procedure som kan returner hver værdi uden ;
Avatar billede stoney Nybegynder
17. juni 2006 - 15:16 #1
Avatar billede hrc Mester
19. juli 2006 - 22:28 #2
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;
Avatar billede ingeman Seniormester
03. september 2006 - 11:37 #3
åbn svar
Avatar billede hrc Mester
03. september 2006 - 12:46 #4
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 ...

unit UValuta;

interface

uses
  SysUtils, ContNrs, Classes, Math;

type
  TValutaData = class(TStringList);

  TValutaList = class
  private
    fLines : TObjectList;
    fFieldsCount : integer;
    function GetField(const aLine, aField: integer): string;
  public
    constructor Create;
    destructor Destroy; override;
    property Items[const aLine, aField : integer] : string read GetField; default;
    function Count : integer;
    property FieldsCount : integer read fFieldsCount;
    procedure Clear;
    procedure LoadFromStream(aStream : TStream);
    procedure SaveToStream(aStream : TStream);
    procedure LoadFromFile(const aFilename : string);
    procedure SaveToFile(const aFilename : string);
  end;

implementation

{ TValutaList }

procedure TValutaList.Clear;
begin
  fLines.Clear;
end;

function TValutaList.Count: integer;
begin
  result := fLines.Count;
end;

constructor TValutaList.Create;
begin
  inherited Create;
  fFieldsCount := -1;
  fLines := TObjectList.Create(true);
end;

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

      fLines.Add(Fields);
    end;
  finally
    List.Free;
  end;
end;

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