fpspreadsheet -> import von fremden Daten im falschen Format

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

fpspreadsheet -> import von fremden Daten im falschen Format

Beitrag von af0815 »

Ich beschäftige mich gerade mit dem Import von Daten aus einer vorgelagerten Station. Diese Daten sind (leider) gegeben als String. Es sind Datum/Zeit, floats, integer und Strings allerdings in falschen Sprachformat (und das auch etwas gemixt).
Beispiel:

Code: Alles auswählen

"04.01.2017 08:05:00";"Artikel1";"150";"131.2";"5";"0.2";"-793.6"

Ich versuche es in etwa so

Code: Alles auswählen

 
  OldFormat, MyFormat : TFormatSettings;
 
  .......
 
  sWorkbookSource1.Worksheet.Clear;
  // store old format and change format for import
  OldFormat:= sWorkbookSource1.Workbook.FormatSettings;
  MyFormat.DecimalSeparator:='.';
  MyFormat.ThousandSeparator:= ' ';
  MyFormat.TimeSeparator:=':';
  MyFormat.DateSeparator:='.';
  MyFormat.ShortDateFormat:='dd.mm.yy';
  sWorkbookSource1.Workbook.FormatSettings := MyFormat;
 
  .....
        sWorkbookSource1.Worksheet.WriteCellValueAsString(j, i, Q_Daten.Fields[i].AsString);
  .....
 
  // Restore Settings
  sWorkbookSource1.Workbook.FormatSettings:= OldFormat;
 

Die Systemeinstellungen sind Deutsch und er Import ist bei den Zahlen Englisch und beim Datum Europäisch. Die Daten werden von der Automatik ja sehr sicher erkannt und zugewiesen. Beim Datum habe ich noch ein wenig Probleme. Sie werden im SpreadSheet Grid angezeigt, allerdings habe ich Probleme die optische Darstellung dort richtig zu haben beim Datum/Zeit, da habe ich die optimalen Einstellungen noch nicht gefunden.

Ich habe mir schon überlegt die procedure TsWorksheet.WriteCellValueAsString(ACell: PCell; AValue: String); zu erweitern, so das ich auch NUR für die Eingabe das Format angeben kann. Denn in der Procedure ist das ja sauber getrennt, nur halt von den aktuellen Einstellung abgeleitet.

Gibt es eine bessere Idee wie man das Stabil hinbekommen kann ?

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet -> import von fremden Daten im falschen Fo

Beitrag von wp_xyz »

Ich versteh noch gar nicht, worum es im Detail geht: Du hast einen String mit diversen Angaben, Werte durch durch Strichpunkt getrennt und mit " eingeschlossen, darunter ein Datum/Zeit-Paar? Du willst die in dem String enthaltenen Werte in eine Zeile eines Worksheet einlesen? Warum dann die Zeile mit Q_Daten_Fields[i].AsString?

fpspreadsheet hat auch einen CSV-Leser (unit fpsCSV). Hast du mal versucht, deine Daten in einen Stream zu schreiben (zur Not geht auch eine Hilfsdatei) und diesen per workbook.ReadFromStream(stream, sfCSV) (bzw. ReadFromFile(filename, svCSV)) einzulesen? Dann brauchst du nicht mit WriteCellValueAsString herumzuhantieren. Außerdem gibt es auch einen globalen CSVParams-Record mit weiteren Einstellmöglichkeiten. Ohne jetzt groß viel optimiert zu haben, liest Spready eine aus deinem Daten-Schnipsel erzeugte CSV-Datei problemlos ein.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet -> import von fremden Daten im falschen Fo

Beitrag von af0815 »

Das mit der einen Zeile ist nur als Beispiel gedacht. Die Daten kommen von mehreren Queries nur als String. Das Problem ist, das das Spreadsheet bzw. PC deutsch ist, die Zahlen im englischen Format sind und das Datum in 'irgendein' Format ist.
Das ganze möchte ich so automatisch wie möglich habe, denn das tritt im Programm häufig auf und wenn an der DB nachgebessert wird, so soll das dem Speadsheet egal sein.

Meine Idee war jetzt einmal, WriteCellValueAsString kourzfristig zu sagen, welche Formatrecord es verwenden soll, unabhängig wie das Format vom Spreadsheet ist.

Ich sehe mir die von dir vorgeschlagenen Wege mal an. Ich gehe davon aus, das das CSV Import auch eine 'Zahlenrate' Routine haben wird.

Andreas

Edit:
TsCSVReader.ReadCellValue und TsWorksheet.WriteCellValueAsString machen genaugenommen dasselbe. Nur mit dem CSVReader wird ein neues Sheet bzw. Zelle angelegt und bei WriteCellValueAsString nicht. Nachdem ich in das vorhandene Workbook buche, ist das Verhalten von WriteCellValueAsString für mich besser.

Komisch ist für mich nur, das beide Routinen das gleiche wollen, aber unterschiedliche Erkennungen verwenden. Bsp: IsNumberValue <-> TryStrToFloat, IsDateTimeValue <-> TryStrToDateTime. Die Try... Routinen sind von der fpc-RTL, die Is... aus der fpsnumformat.

Interessant :-)
Zuletzt geändert von af0815 am So 29. Jan 2017, 13:59, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet -> import von fremden Daten im falschen Fo

Beitrag von wp_xyz »

Ich habe gerade in deiner Musterzeile Jahr und Tag vertauscht und als CSVParams.FormatSettings.ShortDateFormat = 'yyyy.mm.dd' eingetragen und konnte auch diese Datei mit Spready einlesen (Spready hat unter Settings/CSV parameters einen Dialog zur Einstellung der Import-Parameter).

Der CSV-Reader hat gegenüber deiner Methode den Vorteil, dass für Anzeige und Einlesen unterschiedliche Formatierungsparameter verwendet werden können (Anzeige: Workbook.FormatSettings, Einlesen: CSVParams.FormatSettings).

P.S.
Übrigens: MyFormat.ShortDateFormat = 'dd.mm.yy' passt nicht zu deiner Datenzeile mit "04.01.2017 08:05:00" - du muss das Jahr als yyyy definieren.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet -> import von fremden Daten im falschen Fo

Beitrag von af0815 »

wp_xyz hat geschrieben:Der CSV-Reader hat gegenüber deiner Methode den Vorteil, dass für Anzeige und Einlesen unterschiedliche Formatierungsparameter verwendet werden können (Anzeige: Workbook.FormatSettings, Einlesen: CSVParams.FormatSettings).


Genau das wollte ich damit aussagen ob ich mir nicht eine eigene WriteCellValueAsString ableite, der ich die Formatierungsparameter für das Einlesen mitgebe.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet -> import von fremden Daten im falschen Fo

Beitrag von wp_xyz »

r5727 hat eine überladene Version von WriteCellValueAsString mit FormatSettings als Parameter. Damit kann ich auch den CSV-Reader vereinfachen, der im Prinzip dasselbe implementiert (aber halt nicht aktuell, weil die Formatierung von Zahlen als Bruch, die ich nach dem CSV-Format implementiert hatte, nicht enthalten ist, in WriteCellvalueAsString dagegen schon).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet -> import von fremden Daten im falschen Fo

Beitrag von af0815 »

Jetzt bin ich echt unverschämt, aber könntest du auch noch folgende Überladung machen

Code: Alles auswählen

 
{@@ ----------------------------------------------------------------------------
  Writes data defined as a string into a cell. Depending on the structure of the
  string, the worksheet tries to guess whether it is a number, a date/time or
  a text and calls the corresponding writing method.
 
  @param  ARow    Row index of the cell
  @param  ACol    Column index of the cell
  @param  AValue  Value to be written into the cell given as a string. Depending
                  on the structure of the string, however, the value is written
                  as a number, a date/time or a text.
  @param  AFormatSettings  FormatSettings record used for conversion of strings
                  with date/time, numbers etc.
  @return Pointer to the cell
-------------------------------------------------------------------------------}

function TsWorksheet.WriteCellValueAsString(ARow, ACol: Cardinal;
  AValue: String; const AFormatSettings: TFormatSettings): PCell;
begin
  Result := GetCell(ARow, ACol);
  WriteCellValueAsString(Result, AValue, AFormatSettings);
end;
 


Danke :D :D :D :D :D :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet -> import von fremden Daten im falschen Fo

Beitrag von wp_xyz »

--> r5729

Antworten