@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