Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Deutsche Dezimal-Zahl in englisches Format bringen (https://www.delphipraxis.net/194834-deutsche-dezimal-zahl-englisches-format-bringen.html)

Ykcim 11. Jan 2018 18:20

Deutsche Dezimal-Zahl in englisches Format bringen
 
Hallo Zusammen,

ich muss eine große Datenmenge, die in einer Procedure bearbeitet wird, regelmäßig in einen MySQL-Server schieben. Dazu benutze ich eine CSV-Datei und den "Load Data InFile" Befehl. Die CSV-Datei erstelle ich aus einen StringGrid (von TMS). Das Problem ist, dass mein Delphi auf das deutsche Dezimal-Format (1.000,00) und der MySQL-Server auf dem englischen (1,000.00).
Ich habe in der Doku gelesen, dass das Dezimal-Format des StringGrids aus den TFormatSettings kommt.

Kann mir jemand sagen, wie ich die TFormatSettings umstellen kann, damit das StringGrid mit dem englischen Format arbeitet und dann hoffentlich die CSV-Datei korrekt erstellt wird. Im Moment wird die Dezimalzahl nämlich mit Hochkommas gekapselt ("3,45"), das die CSV das Komma als Seperator verwendet. Das hat zur Folge, dass beim "Load Data InFile" Befehl ab dem Komma abgeschnitten wird.

Vielen Dank
Patrick

Delphi.Narium 11. Jan 2018 18:42

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Alles Wesentliche sollte hier zu finden sein: http://www.delphipraxis.net/186432-v...tsettings.html

p80286 11. Jan 2018 23:54

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Zitat:

Zitat von Ykcim (Beitrag 1390824)
Die CSV-Datei erstelle ich aus einen StringGrid (von TMS).

Wenn Du die CSV-Datei erstellst, solltest Du auch das Format im Griff haben.

Besteht nicht auch auf dem SQL-Server, die Möglichkeit, den Feldtrenner zu definieren?

Gruß
K-H

Namenloser 12. Jan 2018 05:40

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Das würde dir doch gar nichts bringen, weil die englische Darstellung immer noch Kommata enthält. Die einzige Lösung ist, deinen CSV-Parser anzupassen, sodass er mit "" umgehen kann.

p80286 12. Jan 2018 08:41

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Zitat:

Zitat von Namenloser (Beitrag 1390847)
Das würde dir doch gar nichts bringen, weil die englische Darstellung immer noch Kommata enthält. Die einzige Lösung ist, deinen CSV-Parser anzupassen, sodass er mit "" umgehen kann.

Ausgerechnet der ist doch Teil von MS-SQL, da wird nicht viel anzupassen sein. Wobei ich es verwunderlich finde, das ausgerechnet er mit " nicht umgehen kann. Der CSV-Import in Access und Excel kann es auf jeden Fall.

Gruß
K-H

Jumpy 12. Jan 2018 09:40

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Ich mag mich ja täuschen, aber sinnvollerweise würde man den 1.000der Punkt nicht bei so einer Importdatei liefern, sondern nur den Dezimaltrenner. Dementsprechend wäre nur ein Punkt in der englischen Darstellung.

Ykcim 12. Jan 2018 10:31

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Hallo Zusammen,

vielen Dank für die Antworten. Ich habe mir den anderen Beitrag durchgelesen und versucht für mich anzuwenden - leider ohne Erfolg. Nachstehend mein Code:
Delphi-Quellcode:
      //CSV-Datei für den UpLoad erstellen
      System.SysUtils.FormatSettings.DecimalSeparator := '.';   //Hier stelle ich das Setting um
      Application.UpdateFormatSettings := false;
      FillAdvGrid(SG_Export, ColsAG, RowsAG);                   //Hier wird das temproäre StringGrid befüllt
      WriteFile('as400');
      FCSVPfad:=FCSVPfad+'AS400UPLOADFILE.CSV';
      SG_Export.SaveToCSV(FCSVPfad);                            //Hier wird die CSV-Datei erstellt
      //CSV-Datei hochladen
      LoadData(FCSVPfad, 'as400temp');                          //Hier wird die CSV-Datei in den MySQL-Server hochgeladen
      Application.UpdateFormatSettings := true;                 //Hier stelle ich das Setting wieder um
      System.SysUtils.FormatSettings.DecimalSeparator := ',';
      //CSV-Datei löschen
      if not DeleteFile(FCSVPfad) then ShowMessage('Datei "'+FCSVPfad+'" konnte nicht gelöscht werden!');
Leider wird bei der Erstellung der CSV-Datei immer noch aus 4.23 "4,23" gemacht. Hat jemand dazu eine Idee?

Vielen Dank
Patrick

galex9 12. Jan 2018 10:39

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Welche Klasse verbirgt sich unter "SG_Export" ?

Ykcim 12. Jan 2018 10:46

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Das ist das StringGrid, welches ich oben in der Procedure als Variable definiere
Delphi-Quellcode:
SG_Export: TAdvStringGrid;
und dann später zum Leben erwecke
Delphi-Quellcode:
SG_Export:= TAdvStringGrid.Create(nil);

Ykcim 12. Jan 2018 12:27

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Also so könnte man es in diesem Falle lösen - allerdings ist das keine gute Lösung...
Ich ändere das Dezimalkennzeichen "manuell" von Komma auf Punkt in einer For-Schleife...
Delphi-Quellcode:
   //CSV-Datei für den UpLoad erstellen
   FillAdvGrid(SG_Export, ColsAG, RowsAG);
   WriteFile('as400');
   FCSVPfad:=FCSVPfad+'AS400UPLOADFILE.CSV';
   //decimalZahl von deutsch nach englisch ändern
   for I := 0 to SG_Export.RowCount -1 do begin
      SG_Export.Cells[21,I]:=StringReplace(SG_Export.Cells[21,I],',','.',[rfIgnoreCase, rfReplaceAll]);
   end;
   SG_Export.SaveToCSV(FCSVPfad);
   //CSV-Datei hochladen
   LoadData(FCSVPfad, 'as400temp');
   //CSV-Datei löschen
   if not DeleteFile(FCSVPfad) then ShowMessage('Datei "'+FCSVPfad+'" konnte nicht gelöscht werden!');
Wenn es einen charmanteren Weg gibt, bin ich daran sehr interessiert...

Vielen Dank
Patrick


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf