AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Problem mit dem Import aus einer csv-Datei in eine StringList

Problem mit dem Import aus einer csv-Datei in eine StringList

Ein Thema von Luca Haas · begonnen am 5. Mai 2020 · letzter Beitrag vom 6. Mai 2020
Antwort Antwort
Luca Haas

Registriert seit: 23. Aug 2017
Ort: Bad Breisig
139 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:02
Hallo zusammen,

ich sitze nun seit letzter Woche daran eine CSV-Datei einzulesen und diese in eine StringList zu schreiben.
Das Ganze benötige ich, um 6 Daten der Liste in einenen DataRecord zu schreiben, hier mein fehlerhafter Code:
Delphi-Quellcode:
var
  tfDatei: TextFile;
  sZInhalt: string;
  liste: TStringList;
  i: Integer;
  tempRecord: dataRecord;
begin
  if ((OpenDialog1.Execute()) and (OpenDialog1.Filename <> '')) then
  begin
    GanttChart1.BeginUpdate(); // Änderungen an der Oberfläche werden gemacht
    try
      liste := TStringList.Create();
      try
        AssignFile(tfDatei, OpenDialog1.Filename);
        Reset(tfDatei);
        i := 0;
        while not Eof(tfDatei) do
        begin
          liste := TStringList.Create;
          ReadLn(tfDatei, sZInhalt);
          liste.Delimiter := ';';
          liste.StrictDelimiter := True;
          liste.DelimitedText := sZInhalt;

          Inc(i); // Kopfzeile

          if i > 1 then // Datenzeilen
          begin //Hier teste ich mit Beispieldaten was auch funktioniert
            tempRecord.StartDate := StrToDateTime('01.01.2020');
            tempRecord.EndDate := StrToDateTime('03.01.2020');
            tempRecord.Duration := 120;
            tempRecord.Bez := 'Test';
            tempRecord.AuftragNr := 123312;
            tempRecord.AuftragPosNr := 1;
            tempRecord.ArbeitsplanPosNr := 1;

            (* // Sobald ich mit liste.Strings[] echte Daten nutzen möchte sütrzt das Programm ab
              tempRecord.StartDate := StrToDateTime(liste.Strings[14]);
              tempRecord.EndDate := StrToDateTime(liste.Strings[15]);
              tempRecord.Duration := StrToInt(liste.Strings[19]);
              tempRecord.Bez := liste.Strings[7];
              tempRecord.AuftragNr := StrToInt(liste.Strings[9]);
              tempRecord.AuftragPosNr := StrToInt(liste.Strings[10]);
              tempRecord.ArbeitsplanPosNr := StrToInt(liste.Strings[2]);
            *)


            csvRecords.Add(tempRecord); // csvRecords ist eine TList<dataRecord> und wurde bereits deklariert
          end;
        end;
      except
        MessageDlg('Est ist ein Fehler aufgetreten, der Prozess wird beendet.', mtError, [mbOK], 0);
      end;
    finally
      FreeAndNil(liste);
      CloseFile(tfDatei);
      GanttChart1.EndUpdate(); // Repaint
    end;
  end;
end;
Ich habe mich schon durch diverse Foren gelesen, allerdings habe ich es selbst damit nicht geschafft das Ganze zu lösen, also wäre es super wenn ich über diesen Weg nötige Hilfe finden könnte.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.545 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:05
Du hast Dir aber ein schönes Speicherleck gebaut. Bist Du sicher, dass Du die Liste einmal vor und dann noch einmal innerhalb der Schleife erzeugen willst?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Luca Haas

Registriert seit: 23. Aug 2017
Ort: Bad Breisig
139 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:09
Ohje.
Nein ist natürlich Schwachsinn, aber behebt das Problem leider nicht.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
933 Beiträge
 
#4

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:14
die Frage ist ja, was passiert denn? Gibt es Fehlermeldungen? Werden denn die Records mit Daten gefüllt? Läufst du in deinen Except-Block?
Hast du das ganz mal im Debugger schrittweise laufen lassen?

ich würde statt StrToDateTime(liste.Strings[14]); mal das StrToDateTime(liste[14]); probieren. Ist ja schon eine StringList. Aber das wird nicht das Problem sein.

Aber Vorsicht, immer prüfen, ob dein liste überhaupt 15 items hat.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder ( 5. Mai 2020 um 14:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.545 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:14
Wie viele Einträge enthält die Liste denn nach der Zuweisung von DelimitedText?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Luca Haas

Registriert seit: 23. Aug 2017
Ort: Bad Breisig
139 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:21
@Hobbycoder, ja ich habe das Ganze schon des öfteren debuggt, sobald ich einen Eintrag der Liste ansprechen möchte springe ich in den Except Block der mir meine Fehlermeldung ausgibt.
Edit: Wenn ich die erste Position der Liste anzeige bekomme ich, mir unbekannte, Schriftzeichen, bei allen anderen Positionen der Liste komme ich dann n den Except Block.

@DeddyH, wenn ich mir die Länge der Liste nach dem DelimitedText anzeige variiert diese zwischen 0 und 3 für alle Einträge (knapp 30 Stück)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
933 Beiträge
 
#7

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:23
Dann zeig doch mal, was zu dem Zeitpunkt in szInhalt steht.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:33
@DeddyH, wenn ich mir die Länge der Liste nach dem DelimitedText anzeige variiert diese zwischen 0 und 3 für alle Einträge (knapp 30 Stück)
Wenn die Länge der Liste variiert, dann hast Du Dein Problem doch schon gefunden, da Du ja feste Linienpositionen umwandeln willst.
Zeig doch mal ein paar dieser Textzeilen aus Deiner Importdatei.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.434 Beiträge
 
Delphi 7 Professional
 
#9

AW: Problem mit dem Import aus einer csv-Datei in eine StringList

  Alt 5. Mai 2020, 14:57
@Hobbycoder, ja ich habe das Ganze schon des öfteren debuggt, sobald ich einen Eintrag der Liste ansprechen möchte springe ich in den Except Block der mir meine Fehlermeldung ausgibt.
Edit: Wenn ich die erste Position der Liste anzeige bekomme ich, mir unbekannte, Schriftzeichen, bei allen anderen Positionen der Liste komme ich dann n den Except Block.

@DeddyH, wenn ich mir die Länge der Liste nach dem DelimitedText anzeige variiert diese zwischen 0 und 3 für alle Einträge (knapp 30 Stück)
Das klingt jetzt erstmal so, als ob ReadLn die Datei garnicht so zeilenweise lesen kann, wie es erwartet wird. Unbekannte Zeichen lassen auch darauf schließen.

Die erste Frage, die zu beantworten wäre ist: Um was für eine Datei handelt es sich?
Zweite Frage: Was für einen Zeichensatz enthält sie.
Dritte Frage: Enthält sie den windowstypischen Zeilenumbruch von #13#10?

Achso: csv heißt Comma-separated values
Ein Semikolon ist kein Komma.

Also zuerst mal prüfen, welches Zeichen denn zur Trennung der einzelnen Werte genutzt wird und dieses Zeichen dann als Delimiter nutzen.

Probier' es mal nicht mit AssignFile ... sondern mit zwei Stringlisten:
Delphi-Quellcode:
var
  sZInhalt: string;
  Datei: TStringList;
  liste: TStringList;
  i: Integer;
  tempRecord: dataRecord;
begin
  if ((OpenDialog1.Execute()) and (OpenDialog1.Filename <> '')) then
  begin
    GanttChart1.BeginUpdate(); // Änderungen an der Oberfläche werden gemacht
    try
      Datei := TStringList.Create();
      liste := TStringList.Create();
      try
        Datei.LoadFromFile(OpenDialog1.Filename);
        // 0. Zeile ist die Kopfzeile, die wir nicht benötigen.
        for i := 1 to Datei.Count - 1 do begin
          // Hier den tatsächlich genutzten Delimiter einfügen.
          // CSV ist nicht gleichbedeutend mit Delimiter := ';'
          liste.Delimiter := ';';
          liste.StrictDelimiter := True;
          liste.DelimitedText := Datei[i];
          if Liste.Count > 19 then // Diese Zeilen ggfls. anpassen an die tatsächlichen Gegebenheiten.
          begin //Hier teste ich mit Beispieldaten was auch funktioniert
            tempRecord.StartDate := StrToDateTime('01.01.2020');
            tempRecord.EndDate := StrToDateTime('03.01.2020');
            tempRecord.Duration := 120;
            tempRecord.Bez := 'Test';
            tempRecord.AuftragNr := 123312;
            tempRecord.AuftragPosNr := 1;
            tempRecord.ArbeitsplanPosNr := 1;

            (* // Sobald ich mit liste.Strings[] echte Daten nutzen möchte sütrzt das Programm ab
              tempRecord.StartDate := StrToDateTime(liste.Strings[14]);
              tempRecord.EndDate := StrToDateTime(liste.Strings[15]);
              tempRecord.Duration := StrToInt(liste.Strings[19]);
              tempRecord.Bez := liste.Strings[7];
              tempRecord.AuftragNr := StrToInt(liste.Strings[9]);
              tempRecord.AuftragPosNr := StrToInt(liste.Strings[10]);
              tempRecord.ArbeitsplanPosNr := StrToInt(liste.Strings[2]);
            *)


            csvRecords.Add(tempRecord); // csvRecords ist eine TList<dataRecord> und wurde bereits deklariert
          end else begin
            MessageDLG(Format('Es wurden nur %d Zeilen für Datensatz %d geliefert. Bitte Dateiformat prüfen.',[Liste.Count,i]),mtError,[mbOk],0);
            break;
          end;
        end;
      except
        // Except ist gut, die Fehlermeldung auch auszugeben deutlich besser.
        on e : Exception do begin
          MessageDlg(Format('Es ist ein Fehler aufgetreten: %s%s',[#13#13,e.Message], mtError, [mbOK], 0);
        end;
      end;
    finally
      FreeAndNil(liste);
      FreeAndNil(Datei);
      GanttChart1.EndUpdate(); // Repaint
    end;
  end;
end;
(Nur hingedaddelt und nicht getestet.)

Zitat:
Allerdings weiß ich nicht wie ich die Datei dann entsprechend anpasse, dass ich Sie delimiten kann...
Die Datei kommt doch irgendwo her, der Lieferant muss also anpassen oder Du musst Deinen Code an die Datei anpassen.

Wenn Du da Hilfe möchtest, häng' bitte mal eine entsprechende Datei hier an, dann können wir mit reinschauen und nach 'ner Lösung suchen. Ohne den konkreten Inhalt der Dateien zu kennen, ist eine wirklich zielführende Hilfe nicht möglich.

Achso: Weil ich wiedermal deutlich zu lang für meine Antwort benötigt habe, könnten sich Teile davon inzwischen erübrigt haben
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz