Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi CSV einlesen und in Stringlist speichern (https://www.delphipraxis.net/99079-csv-einlesen-und-stringlist-speichern.html)

merlin2539 6. Sep 2007 14:28


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:
 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 mir jemand helfen? Benutze delphi 6

kann das sein das der befehl hier nicht geht? ( s.StrictDelimiter := true;)

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

mkinzler 6. Sep 2007 15:30

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.

merlin2539 6. Sep 2007 18:06

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?

mkinzler 6. Sep 2007 18:16

Re: CSV einlesen und in Strinlist speichern
 
Zitat:

gibt es ein möglichkeit leicht auf office zuzugreifen?
Ja OLE/COM

grenzgaenger 6. Sep 2007 22:05

Re: CSV einlesen und in Strinlist speichern
 
guckste hier: Titel: Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...

mkinzler 7. Sep 2007 06:31

Re: CSV einlesen und in Strinlist speichern
 
Bzw. der Artikel von Lemmy über die Automatisierung von Office
http://www.dsdt.info/tutorials/automation/

DGL-luke 7. Sep 2007 11:44

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:
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.
Benutzung:

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:
*;abc\;def\\;*
Wird als folgender Datensatz erkannt:
Code:
abc;def\
(Doppelte Angabe des Escapechars führt zur Erkennung eines einfachen Vorkommens des Escapechars als Literal!)
In Grouper ein Char, der einen Datensatz begrenzt, damit z.B. der Separator darin vorkommen kann:
Code:
*;"abc;def";*
wird zu
Code:
abc;def
UseEscaper und UseGrouper werden benutzt, um festzulegen, ob der übergebene Escaper/Grouper interpretiert werden.
Wenn z.B. Escaper='\', aber UserEscaper auf false steht, wird folgendes:
Code:
*;abc\def;'*
zu
Code:
abc\def
Auch der Grouper wird dann als ganz normales Literal in den erkannten Datensatz übernommen.

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:
abc\;def\\
Das escapete Semikolon wird also erkannt und nicht als Separator behandelt, der Escaper davor wird aber stehengelassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 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