AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CSV einlesen und in Stringlist speichern

Ein Thema von merlin2539 · begonnen am 6. Sep 2007 · letzter Beitrag vom 7. Sep 2007
Antwort Antwort
merlin2539

Registriert seit: 2. Nov 2005
13 Beiträge
 
#1

CSV einlesen und in Stringlist speichern

  Alt 6. Sep 2007, 15:28
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]
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: CSV einlesen und in Strinlist speichern

  Alt 6. Sep 2007, 16:30
Leerzeichen werden immer als Trenner erkannt (Bug in Delphi)
Trenne besser mit Pos/PosEx oder verwende ein CSV-DataSet.
Markus Kinzler
  Mit Zitat antworten Zitat
merlin2539

Registriert seit: 2. Nov 2005
13 Beiträge
 
#3

Re: CSV einlesen und in Strinlist speichern

  Alt 6. Sep 2007, 19:06
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: CSV einlesen und in Strinlist speichern

  Alt 6. Sep 2007, 19:16
Zitat:
gibt es ein möglichkeit leicht auf office zuzugreifen?
Ja OLE/COM
Markus Kinzler
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#5

Re: CSV einlesen und in Strinlist speichern

  Alt 6. Sep 2007, 23:05
guckste hier: Titel: Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: CSV einlesen und in Strinlist speichern

  Alt 7. Sep 2007, 07:31
Bzw. der Artikel von Lemmy über die Automatisierung von Office
http://www.dsdt.info/tutorials/automation/
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: CSV einlesen und in Stringlist speichern

  Alt 7. Sep 2007, 12:44
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:25 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