CSV und Stringlist.DelimitedText

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
pschoett
Beiträge: 36
Registriert: Sa 7. Feb 2015, 11:48

CSV und Stringlist.DelimitedText

Beitrag von pschoett »

Hallo allerseits,
ich möchte eine mehrzeilige CSV Datei in ein TStringList elnlesen, um die einzelnen CSV-Felder ansprechen zu können. Allerdings gibt mir dieser Code jedes einzelne Zeichen aus und nicht jedes einzelne Feld.

Code: Alles auswählen

var
  StrLst: TStringList;
  i: Integer;
begin
  StrLst := TStringList.Create;
  StrLst.LoadFromFile(FILE_NAME);
  StrLst.Delimiter := ';';
  StrLst.StrictDelimiter := true;
  For i := 0 to StrLstArr.Count - 1 do
  begin
    for j := 0 to High(StrLst[i])do
      writeln(j, ' : ', StrLst[i][j])// Ausgabe jedes einzelnen Zeichens der CSVzeilen
    ReadLn;
  end;

Ich denke, dass StrLst.DelimitedText:=... fehlt, aber mit dem LoadFromFile habe ich die CSV ja schon eingelesen.
Alternativ funktioniert, die CSV erst als Textfile öffnen (assignfile, reset,...) und dann zeilenweise als String dem StrLst.DelimitedText übergeben, aber das scheint mir zu umständlich zu sein. Oder widersprechen sich LoadFromFile und DelimitedText?
Was mache ich falsch?

Gruß,
Peter

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: CSV und Stringlist.DelimitedText

Beitrag von wp_xyz »

Wenn du eine CSV-Datei einlesen willst, musst du beachten, dass es (wahrscheinlich - ich kenne die Datei nicht) zwei Arten von Trennzeichen gibt: Zum einen die Trenner für die Zeilen, also CRLF, CR, oder LF, je nach Betriebssystem, oder allgemein in FPC: Lineending. Und zum anderen die Trenner für die einzelnen Spalten in jeder Zeile; da du von StrictDelimiter = ';' schreibst, handelt es sich hier wahrscheinlich um den Strichpunkt. Der Dateiinhalt könnte also etwa so aussehen:

Code: Alles auswählen

abc def;ghi;jkl;mno;pqr;stu;vwx;yz 
123;456;789;012;345;678;901;234;567
AAA;BBB;CCC

Wenn du das mit LoadFromFile in eine StringList "StrList" einliest, stehen die Zeilen mit dem Index i als StrList.Items[i] oder kürzer StrList[i] zur Verfügung. Jede Zeile musst du nun am Strichpunkt in die einzelnen Felder auftrennen. Am einfachsten geht das mit dem StringHelper ".Split", der die einzelnen Felder in ein Stringarray ablegt:

Code: Alles auswählen

var
  StrList: TStringList;
  i: Integer;
  sa: TStringArray;
begin
  StrList := TStringList.Create;
  try
    StrList.LoadFromFile(DATEI_NAME);
    WriteLn('Original-Text:');
    WriteLn(StrList.Text);
    for i:=0 to StrList.Count-1 do begin
      WriteLn('Zeile: ', i);
      sa := StrList[i].Split(';');
      for j:=0 to High(sa) do
        WriteLn('  j: ', j, '  Feldinhalt: ', sa[j]);
    end;
  finally
    StrList.Free;
  end

Oder du nimmtst eine zweite StringListe mit Delimiter ';', StrictDelimiter true, und weist ihrem DelimitedText den Inhalt jeder Zeile zu; damit erhältst du die Feldelemente als Elemente der zweiten StringList; die Trennung erfolgt automatisch in der StringList, wenn ihr ein String an DelimitedText zugewiesen wird:

Code: Alles auswählen

var
  StrList: TStringList;
  Felder: TStringList;
  i, j: Integer;
begin
  StrList := TStringList.Create;
  try
    StrList.LoadFromFile(DATEI_NAME);
    WriteLn('Original-Text:');
    WriteLn(StrList.Text);
    Felder := TStringList.Create;
    try
      Felder.Delimiter := ';';
      Felder.StrictDelimiter := true;
      for i:=0 to StrList.Count-1 do begin
        WriteLn('Zeile: ', i);
        Felder.DelimitedText := StrList[i];
        for j := 0 to Felder.Count-1 do
          WriteLn('  j: ', j, '  Feldinhalt: ', Felder[j]);
    finally
      Felder.Free;
    end;
  finally
    StrList.Free;
  end;
end

pschoett
Beiträge: 36
Registriert: Sa 7. Feb 2015, 11:48

Re: CSV und Stringlist.DelimitedText

Beitrag von pschoett »

Ok, das habe ich verstamden.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: CSV und Stringlist.DelimitedText

Beitrag von theo »


Antworten