Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Stringgrid als CSV datei speichern. (https://www.delphipraxis.net/84856-stringgrid-als-csv-datei-speichern.html)

twospirit 22. Jan 2007 21:27


Stringgrid als CSV datei speichern.
 
Hallo,

wir haben in unserer Ausbildung HPS(Höhere Programmier Sprachen) und dort lernen wir immoment mit Delphi ein bischen Programmieren, ich hatte bei einem Geschäfft Praktikum gehabt und sollte mal ihre Kasse nach bauen.
Dafür brauch ich eine art Datenbank, hab mich einfach mal für eine CSV-Datei entschieden und im Hintergrund ist eine Stringgrid was als Lager fungiert.
Ich habe ein bischen im Internet herum geschaut und habe eine Möglichkeit gefunden wie ich ein Stringgrid in eine CSV-Datei speichern kann.

Quellcode:
Delphi-Quellcode:
function TForm1.SaveToCSV:Boolean;
var
  SD : TSaveDialog;
  I : Integer;
  CSV : TStrings;
  FileName : String;
begin
  Try
  // Filedialog erzeugen
  SD := TSaveDialog.Create(Self);
  SD.Filter := 'CSV-Trennzeichen getrennt (*.csv)|*.CSV';
  //Filedialog ausführen
  If SD.Execute = True Then
  Begin
    //Filename zuweisen
    FileName := SD.FileName;
    If Copy(FileName,Pos('.',FileName),Length(FileName)-Pos('.',FileName)+1) <> '.csv' Then FileName := FileName + '.csv';
    Screen.Cursor := crHourGlass;
    //Stringliste erzeugen
    CSV := TStringList.Create;
    Try
      //Stringliste füllen
      For I := 0 To Grid.RowCount - 1 Do CSV.Add(Grid.Rows[I].CommaText);
      //CSV speichern
      CSV.SaveToFile(FileName);
      Result := True;
    Finally
      CSV.Free;
    End;
  End;

  Finally
    SD.Free;
    Screen.Cursor := crDefault;
  End;
end;

//SaveToCSV ausführen (sample call)
procedure TForm1.BtnSaveClick(Sender: TObject);
begin
   SaveToCSV;
end;
Das funktioniert ganz gut, doch möchte ich nicht, dass er mich frag wo die Datei gespeichert werden soll, sondern er soll sie eigenständig irgendwo abspeichern.

Kennt sich da jemand aus und weis Rat?


MfG twoSpirit

Norbert987 22. Jan 2007 22:29

Re: Stringgrid als CSV datei speichern.
 
Erstmal Herzlich Willkommen twospirit!

In deinem Fall kannst du die Variablen SD (der Dialog der angezeigt wird) und Filename löschen. Bei "CSV.SaveToFile(FileName);" schreibst du nun statt FileName den Pfad rein, das wars.

Tobias

EDIT: auch die if Abfrage, ob die Dateiendung .csv ist fällt somit weg...

twospirit 22. Jan 2007 22:38

Re: Stringgrid als CSV datei speichern.
 
Hallo,

es funktioniert perfekt, danke viel mals.
> Erstmal Herzlich Willkommen twospirit!
Danke schön ;)

MfG twoSpirit

delphin06 17. Apr 2007 18:28

Re: Stringgrid als CSV datei speichern.
 
gibt es auch ne funktion das alles wieder von der csv datei in das stringrid zu laden?

Apollonius 17. Apr 2007 18:38

Re: Stringgrid als CSV datei speichern.
 
Natürlich geht das. Du musst nur alles umgekehrt machen:
Delphi-Quellcode:
procedure laden;
var h:TStrings; i:integer;
begin
h:=TStringlist.create;
try
  h.loadfromfile('xyz.csv'); //<-- der Dateiname
  for i:=o to h.count-1 do
   MeinStringgrid.rows[i].commatext:=h[i];
finally
  h.free;
end;

end;
Das wars schon.

delphin06 17. Apr 2007 18:59

Re: Stringgrid als CSV datei speichern.
 
cool danke!

tadlanra 31. Okt 2008 08:47

Re: Stringgrid als CSV datei speichern.
 
hallo
ich versuche gerade genau das, was hier im thread steht. nur ist es bei mir so, dass wenn ich eine csv datei in excel öffnen will ein Semikolon als spaltentrenner benötige. warum ist das so?

gibt es eine ähnliche funktion wie "commatext" die sich dann auf semikolon bezieht? derzeit ersetze ich halt alle kommas durch ';'

nahpets 31. Okt 2008 09:00

Re: Stringgrid als CSV datei speichern.
 
Hallo,
hilft Dir das?
Delphi-Quellcode:
StringGrid1.Rows[i].Delimiter := ';'

tadlanra 31. Okt 2008 09:07

Re: Stringgrid als CSV datei speichern.
 
ah da bin ich auch schonmal drüber gestolpert und habs dann wieder vergessen mal auszutesten. werds mal versuchen. aber noch ne antwort warum man manchmal ';' und manchmal ',' und manchmal auch #9 benötigt als spaltentrenner? ist das excelversionsabhängig?

nahpets 31. Okt 2008 09:21

Re: Stringgrid als CSV datei speichern.
 
Hallo,

nö, ich würd' mal sagen: Das ist phantasieabhängig.

Es heißt Commaseperated und deshalb nimmt Excel ; :wink:

Nein, dass ist eigentlich eine Sache der Vereinbarung. Nehme selbst gerne den senkrechten Strich (|), dann darf im Text auch mal ein Komma oder ein Semikolon sein.
http://de.wikipedia.org/wiki/CSV_(Dateiformat)

Hansa 31. Okt 2008 09:33

Re: Stringgrid als CSV datei speichern.
 
Zitat:

Zitat von nahpets
Nehme selbst gerne den senkrechten Strich (|), dann darf im Text auch mal ein Komma oder ein Semikolon sein.

Man kann sich ein noch so komisches Zeichen aussuchen und es wird doch jemand verwenden ! Insofern ist ein festes Trennzeichen zu vermeiden. :shock:

nahpets 31. Okt 2008 09:42

Re: Stringgrid als CSV datei speichern.
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von nahpets
Nehme selbst gerne den senkrechten Strich (|), dann darf im Text auch mal ein Komma oder ein Semikolon sein.

Man kann sich ein noch so komisches Zeichen aussuchen und es wird doch jemand verwenden ! Insofern ist ein festes Trennzeichen zu vermeiden. :shock:

Deshalb ja auch: Ich nehme gerne und nicht Ich nehme immer :P

Hansa 31. Okt 2008 09:44

Re: Stringgrid als CSV datei speichern.
 
Mach es doch lieber gleich wasserfest. Im IT-Bereich heißt 100% eben 100 % und nicht 99,9 % :!:

nahpets 31. Okt 2008 09:57

Re: Stringgrid als CSV datei speichern.
 
Zitat:

Zitat von Hansa
Mach es doch lieber gleich wasserfest. Im IT-Bereich heißt 100% eben 100 % und nicht 99,9 % :!:

Ok: Wie mache ich es wasserfest, wenn das Trennzeichen ein beliebiges aus dem Zeichenvorrat sein kann?

Hansa 31. Okt 2008 09:59

Re: Stringgrid als CSV datei speichern.
 
Indem kein Trennzeichen verwendet wird. Reicht das noch immer nicht ? :mrgreen:

sx2008 31. Okt 2008 10:05

Re: Stringgrid als CSV datei speichern.
 
Zitat:

Zitat von nahpets
Ok: Wie mache ich es wasserfest, wenn das Trennzeichen ein beliebiges aus dem Zeichenvorrat sein kann?

Felder, die das Trennzeichen enthalten werden "gequoted", also in Anführungszeichen eingeschlossen:
Code:
12,"Feld, das ein Komma enthält",Feld ohne Komma,2008-10-31
Anführungszeichen in Feldern müssen verdoppelt werden:
Code:
13,"""die grüne Hölle"" wird die Rennstrecke genannt"

tadlanra 31. Okt 2008 10:11

Re: Stringgrid als CSV datei speichern.
 
also ;) ich hab ne csv datei und die hat das trennzeichen ; also muss ich das ja übernehmen bzw wenn ich in excel ne erstellte csv datei öffne braucht die auch das zeichen als trenner sonst akzeptiert sie es ja nicht. wie also kann ich mir selber ein trennzeichen aussuchen? ich schätze mal es ist so gemeint, dass ich für mein stringgrid ne trennung aussuchen kann.
hier mal mein code

Code:
 
procedure TForm6.visuopen(const datei2 : string);
var
  grid:TStrings;
  row : integer;

begin
  grid:=TStringlist.create;
try
  grid.loadfromfile(datei2);
   
  SGvisu.rows[row].delimiter:=';';
 
  for row := 0 to grid.count - 1 do
  begin
    SGvisu.rows[row].DelimitedText:=grid[row];
  end;
finally
  grid.free;
end;
hm aber gibt mir nicht das ergebnis was ich will. er scheint das semikolon gar nicht wirklich als trenner zu nehmen. manchmal leerzeichen oder hochkommas. was fehlt denn bzw was ist falsch?

DeddyH 31. Okt 2008 10:13

Re: Stringgrid als CSV datei speichern.
 
Du musst Dir die Zeilen in der csv, die falsch ausgegeben werden, einmal ansehen. Vermutlich ist das Trennzeichen in den Daten vorhanden oder etwas in der Art.

tadlanra 31. Okt 2008 10:14

Re: Stringgrid als CSV datei speichern.
 
ui peinlich. muss in die schleife rein :) jetzt klappts ;)

DeddyH 31. Okt 2008 10:15

Re: Stringgrid als CSV datei speichern.
 
Stimmt, hab ich glatt übersehen :lol:

nahpets 31. Okt 2008 10:17

Re: Stringgrid als CSV datei speichern.
 
Zitat:

Zitat von sx2008
Zitat:

Zitat von nahpets
Ok: Wie mache ich es wasserfest, wenn das Trennzeichen ein beliebiges aus dem Zeichenvorrat sein kann?

Felder, die das Trennzeichen enthalten werden "gequoted", also in Anführungszeichen eingeschlossen:
Code:
12,"Feld, das ein Komma enthält",Feld ohne Komma,2008-10-31
Anführungszeichen in Feldern müssen verdoppelt werden:
Code:
13,"""die grüne Hölle"" wird die Rennstrecke genannt"

Das heißt: Das ich an den Lieferanten der Daten sehr hohe Ansprüche stellen muss, die er z. B. mit den gewöhnlichen Mitteln (wie Excel) nicht erfüllen kann.

Code:
12,"Feld, das ein Komma enthält",Feld ohne Komma,#Feld, das " enthält#^feld, das , + ; + " + # enthält^2008-10-31
Code:
12,"Feld, das ein Komma enthält",""""Feld das "" enthält"""",2008-10-31
Code:
12,"Feld, das ein Komma enthält",""""""Feld das """ enthält"""""",2008-10-31
Ich muss häufig Daten importieren, die mit Excel gesammelt wurden und dann irgendwann in irgendeine Datenbank sollen, in dem Zusammenhang ist die spalteninhaltsabhängige Quotierung absurd.

PS.: Wir schweifen vom Thema ab.

Sir Rufo 31. Okt 2008 10:22

Re: Stringgrid als CSV datei speichern.
 
Hi,

also statt
Delphi-Quellcode:
If Copy(FileName,Pos('.',FileName),Length(FileName)-Pos('.',FileName)+1) <> '.csv' Then FileName := FileName + '.csv';
würde ich ja
Delphi-Quellcode:
FileName := ChangeFileExt( FileName, '.csv' );
nehmen.
Denn sonst passiert das:
'Meine.csv.Datei.csv' --falsch--> 'Meine.csv.Datei.csv.csv' --richtig--> 'Meine.csv.Datei.csv'
'Meine.Tolle.Datei.txt' --falsch--> 'Meine.Tolle.Datei.txt.csv' --richtig--> 'Meine.Tolle.Datei.csv'

cu

Oliver

Hansa 31. Okt 2008 10:25

Re: Stringgrid als CSV datei speichern.
 
einfache "Trennzeichen" und diese verdoppelt darzustellen als Text, kanns ja wohl auch nicht sein. Man nehme feste Feldlängen, irgendwelche Zeichen sind völlig egal und fertig. Eben genau so wie Import/Export auch in Excel geht.

Mann mann, schlägt roter Kasten aber zu. :P

Zitat:

Zitat von DeddyH
Du musst Dir die Zeilen in der csv, die falsch ausgegeben werden, einmal ansehen. Vermutlich ist das Trennzeichen in den Daten vorhanden oder etwas in der Art.

Genau diesen Mist sollte man eben vermeiden. Nächster Vorteil : die erstellte sogenannte CSV-Textdatei läßt sich in Editor laden. Stehen die Felder nicht immer genau bündig untereinander, dann stimmt was nicht. Dasselbe gilt, sofern length (zeile) nicht überall denselben Wert hat. geht bei "richtigen" CSV-Dateien eben auch nicht. "CSV" sollte man NICHT wörtlich nehmen.

Jetzt hat der rote Kasten sage und schreibe 6mal zugeschlagen. :shock: Filesize ist auch noch wichtig, um sofort zu sehen, ob das Ergebnis stimmen kann oder nicht. Auch das geht bei wörtlich genommenen CSV-Dateien nicht !

nahpets 31. Okt 2008 10:40

Re: Stringgrid als CSV datei speichern.
 
@Hansa

Du hast im Prinzip ja vollkommen recht, aber das kann ich meinen Anwendern alles tausendmal erklären, ich muss immer überarbeiten und wenn ich als Trenner dann wenigstens den | habe, hab' ich einen Anhaltspunkt, wo denn die Probleme beim Import herkommen könnten.
Wir sind uns vom Prinzip einig, daher genug [OT]

Hansa 31. Okt 2008 11:01

Re: Stringgrid als CSV datei speichern.
 
Zitat:

Zitat von nahpets
Wir sind uns vom Prinzip einig

Ne, nicht ganz. :mrgreen: Trennzeichen stammen aus der Zeit, als es folgendes gab : 'a'..'z' 'A'..'Z', '-','.','0'..'9'. Da war der ; erste Wahl. Nur, was kommt wenn einer heute aus Versehen die Tastatur auf englisch umstellt und er will 'Ö' schreiben ? Da kommt ein ';' ! Und schon ists passiert. Ein falsches Zeichen genügt, um die ganze Datei unbrauchbar zu machen. Nehmen wir halt das hier : | . Kriegt so schnell keiner hin, wie ? Es genügt ein Blick auf die Tastatur. Kenne folgenden Fall :

Delphi-Quellcode:
*------------------------*
|                        |
*------------------------*
Das war eine Artikel-Bezeichnung, wo in das Kästchen was von Hand eingetragen werden sollte. Ein anderer Spezialist hat das so gemacht :

Delphi-Quellcode:
.
.
.
Dem waren wohl Leerzeilen lieber. Da ist man auch vom ; nicht mehr weit weg und dein | war sogar schon da. Und sollten die Daten aus Excel stammen, dann stellt man sich besser die Feldweiten einmalig ein und Ruhe ist. Nie mehr Ärger mit komischen Trennzeichen.

nahpets 31. Okt 2008 14:14

Re: Stringgrid als CSV datei speichern.
 
@Hansa
Du hast ja recht, aber das bekomme ich meinen Anwendern nicht beigebracht, da überfordere ich sie.
Es ist schon eine Herausforderung, wenn ich darum Bitte, als Trennzeichen den | zu nehmen.
Muss halt in der Regel Addressdaten importieren, da kommen schonmal Aufzählungen mit Komma oder Semikolon vor, aber nicht mit |.
Und das ich durch solche Kästchen, wie Du sie zeichnest, durch muss, ist mir (zum Glück) noch nicht passiert. Bei sowas würd' ich dann schlicht und einfach streiken.

hoika 31. Okt 2008 15:28

Re: Stringgrid als CSV datei speichern.
 
Hallo,

um noch mal auf die Frage zurückzukommen "versionsahängig".
Jepp, das ist es.
Je nach Version ist mal Komma oder Semikolon als einziger Trenner voreingestellt.


Heiko

Hansa 31. Okt 2008 15:34

Re: Stringgrid als CSV datei speichern.
 
Zitat:

Zitat von hoika
um noch mal auf die Frage zurückzukommen "versionsahängig".
..Je nach Version ist mal Komma oder Semikolon als einziger Trenner voreingestellt.

Wo wurde was von Version und weshalb gefragt ?

hoika 1. Nov 2008 06:45

Re: Stringgrid als CSV datei speichern.
 
Hallo,

huch, stümmt ;)
Da habe ich wohl einen anderen Thread im Kopf gehabt.


Heiko

alzaimar 1. Nov 2008 08:06

Re: Stringgrid als CSV datei speichern.
 
Etwas Theorie sowie ein CSV-Reader ist in diesem Thread nachzulesen.


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