CSV und Stringlist.DelimitedText

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

CSV und Stringlist.DelimitedText

Beitragvon pschoett » 8. Feb 2019, 12:35 CSV und Stringlist.DelimitedText

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
pschoett
 
Beiträge: 36
Registriert: 7. Feb 2015, 11:48

Beitragvon wp_xyz » 8. Feb 2019, 13:05 Re: CSV und Stringlist.DelimitedText

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
wp_xyz
 
Beiträge: 2862
Registriert: 8. Apr 2011, 08:01

Beitragvon pschoett » 8. Feb 2019, 14:16 Re: CSV und Stringlist.DelimitedText

Ok, das habe ich verstamden.
pschoett
 
Beiträge: 36
Registriert: 7. Feb 2015, 11:48

Beitragvon theo » 8. Feb 2019, 14:27 Re: CSV und Stringlist.DelimitedText

theo
 
Beiträge: 8151
Registriert: 11. Sep 2006, 18:01

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried