![]() |
CSV einlesen und in Stringlist speichern
Hallo zusammen
habe ein kleines Problem, habe auch schon hier im forum gesucht aber noch nicht das richtige gefunden bzw. umwurstelbares. Möchte nur eine csv datei in eine stringlist einlesen Eingabe dasf sadf;asdf asdf;asdf asdf; fdf fff;"asdfasdf;asdf" ^ ^ ^ ^ ^ ^ je der ^ eine Variable, aber mein PRG macht nach jedem Blank auch eine Variable
Delphi-Quellcode:
kann mir jemand helfen? Benutze delphi 6
s := TStringList.Create;
t := TStringlist.Create; Try s.LoadFromFile('datei.csv'); s.Delimiter := ';'; s.DelimitedText := s.Strings[0]; label1.Caption:= s.Strings[0]; label2.Caption:= s.Strings[1]; label3.Caption:= s.Strings[2]; s.delete(0); //s.SaveTofile('datei1.csv'); Finally kann das sein das der befehl hier nicht geht? ( s.StrictDelimiter := true;) [edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit] |
Re: CSV einlesen und in Strinlist speichern
Leerzeichen werden immer als Trenner erkannt (Bug in Delphi)
Trenne besser mit Pos/PosEx oder verwende ein CSV-DataSet. |
Re: CSV einlesen und in Strinlist speichern
das problem ist folgendes, das ich die datei aus excel exportiere und dieser se manchmal mit ohne " ausgibt. weist du eine andere möglichkeit dies zu nutzen? gibt es ein möglichkeit leicht auf office zuzugreifen?
|
Re: CSV einlesen und in Strinlist speichern
Zitat:
|
Re: CSV einlesen und in Strinlist speichern
|
Re: CSV einlesen und in Strinlist speichern
Bzw. der Artikel von Lemmy über die Automatisierung von Office
![]() |
Re: CSV einlesen und in Stringlist speichern
Hallo,
habe hier mal ein schnell hingehacktes CSV-To-Stringlist geschrieben. Funktioniert allerdings noch nicht hundertprozentig! Werde das noch korrigieren, bzw. komplett umschreiben. Hier als komplette Unit:
Delphi-Quellcode:
Benutzung:
unit UCSV;
interface uses Classes; function CSVToStringList(Text: string; Separator, Escaper, Grouper: Char; UseEscaper, UseGrouper, ResolveEscapings, ResolveGroupings: Boolean): TStrings; implementation function GetNextCharPos(Text: string; C: Char; StartPos: Integer): Integer; var i: Integer; begin for i := StartPos to Length(Text) do if Text[i] = C then begin Result := i; Break; end; end; function CSVToStringList(Text: string; Separator, Escaper, Grouper: Char; UseEscaper, UseGrouper, ResolveEscapings, ResolveGroupings: Boolean): TStrings; var i: Integer; Buffer: string; ClosingGrouperPos: Integer; begin Result := TStringList.Create; i := 1; while i <= Length(Text) do begin if (Text[i] = Separator) or ((i = Length(Text)) and (Buffer <> '')) then begin Result.Add(Buffer); Buffer := ''; Inc(i) end else if (Text[i] = Escaper) and (UseEscaper) then if ResolveEscapings then begin Buffer := Buffer + Text[i+1]; Inc(i,2); end else begin Buffer := Buffer + Text[i+1] + Text[i+2]; Inc(i,2); end else if (Text[i] = Grouper) and (UseGrouper) then begin repeat ClosingGrouperPos := GetNextCharPos(Text,Grouper,i+1); until (Text[ClosingGrouperPos-1] <> Escaper) or (not UseEscaper); if ResolveGroupings then Buffer := Copy(Text,i+1,ClosingGrouperPos-1) else Buffer := Copy(Text,i,ClosingGrouperPos); i := ClosingGrouperPos + 1; //we will hit the separator in next iteration and flush the buffer. end else begin Buffer := Buffer + Text[i]; Inc(i); end; end; end; end. In Text muss der komplette CSV-String übergeben werden. In Separator der Char, der die einzelnen Datensätze trennt, also typischerweise ';'. In Escaper ein Escapechar, der dafür sorgt, dass der ihm folgende Char keinesfalls als Steuerzeichen erkannt wird, also z.B. '\'. Beispiel:
Code:
Wird als folgender Datensatz erkannt:
*;abc\;def\\;*
Code:
(Doppelte Angabe des Escapechars führt zur Erkennung eines einfachen Vorkommens des Escapechars als Literal!)
abc;def\
In Grouper ein Char, der einen Datensatz begrenzt, damit z.B. der Separator darin vorkommen kann:
Code:
wird zu
*;"abc;def";*
Code:
UseEscaper und UseGrouper werden benutzt, um festzulegen, ob der übergebene Escaper/Grouper interpretiert werden.
abc;def
Wenn z.B. Escaper='\', aber UserEscaper auf false steht, wird folgendes:
Code:
zu
*;abc\def;'*
Code:
Auch der Grouper wird dann als ganz normales Literal in den erkannten Datensatz übernommen.
abc\def
Wenn ResolveEscapings bzw. ResolveGroupings auf true ist, werden Escaper und Grouper aus dem erkannten Datensatz entfernt. Das obige Beispiel für Escaper nimmt an, dass ResolveEscapings auf true steht; ansonsten würde das Ergebnis so aussehen:
Code:
Das escapete Semikolon wird also erkannt und nicht als Separator behandelt, der Escaper davor wird aber stehengelassen.
abc\;def\\
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz