AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi CSV Textdatei in Memtable laden und mit Query abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

CSV Textdatei in Memtable laden und mit Query abfragen

Ein Thema von fisipjm · begonnen am 20. Okt 2022 · letzter Beitrag vom 25. Okt 2022
Antwort Antwort
fisipjm

Registriert seit: 28. Okt 2013
298 Beiträge
 
#1

CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 20. Okt 2022, 14:56
Datenbank: SQLite • Version: 1.0 • Zugriff über: Firedac
Hi,

Ich steh mal wieder auf Kriegsfuß mit den Batchmove komponenten oder der Memtable, da bin ich mir tatsächlich nicht ganz sicher

Ich möchte folgendes Erreichen:
Ich habe CSV Dateien (Der Aufbau und die Zusammensetzung sind hier egal, das einzige was zählt, sie sind Syntaktisch korrekt) die CSV Dateien möchte ich am Schluss in der Form im Programm haben, dass ich Sie mit Standard SQL abfragen kann. Es soll keine Zusätzliche Connection zu einem externen DBMS nötig sein, also habe ich folgedes versucht, das eigentlich auch soweit schon funktioniert.

BatchmoveTextReader --> Liest CSV
BatchmoveDatasetWriter --> Schreibt in Memtabale
FDconnection, LocalSQL und SQLitePhysLink --> Kümmern sich brav darum die Memtable im Speicher zur Verfügung zu stellen
FDQuery --> Quatscht brav mit der Memtable über die LocalSQL Anbindung
Batchmove --> Kümmer sich um dasd "Felder Raten" und die Anlage der korrepondierenden Felder in der Memtable

Mein Problem ist folgendes, beim ersten mal ausführen von FDBatchmove.GuessFormat und FDBtchmove.Execute werden automatisch in der Memtable die Fielddefs erstellt. Leider bekomme ich diesen Prozess im Code nicht wiederholt, so dass ich als nächstes eine andere Datei einlesen kann. Ich bekomme dann die unterschiedlichsten Fehlermeldungen. Entweder, dass die Quell und Zielfelder nicht passen, das die Datenmenge nicht offen ist, dass die Datenmenge nicht initialisiert ist... ich dreh mich irgendwie im Kreis.

Die Frage ist also, wie bekomme ich die Batchmove komponenten dazu überredet, bei einem 2. durchlauf, die Felder in meiner Memtable wieder neu zu erstellen?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#2

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 20. Okt 2022, 15:12
Hast du poClearDest oder poClearDestNoUndo in den BatchMove Options aktiv?

Eventuell musst du die Zieltabelle auch vorher löschen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
298 Beiträge
 
#3

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 24. Okt 2022, 11:23
Hi Uwe,

danke für den Hinweis, dass hat zum Teil schon geholfen. Kannst du mir einen kleinen Gefallen tun
Ich habe in den Anhang eine Zip gepackt mit einem kleinen Programm das mein derzeitiges Problem verdeutlicht. In der Zip sind auch 2 CSV Dateien mit drin. Ich verstehen nicht waum der Import nicht funktioniert. Die GuessFormat Funktion gibt einfach keine Feldbezeichnungen zurück und ich verstehe nicht warum.
Ich befürchte langsam seh ich vor lauter Wald keine Bäume mehr.

grüß
PJM
Angehängte Dateien
Dateityp: zip CSV Loader.zip (92,2 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#4

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 24. Okt 2022, 12:44
Damit GuessFormat die erste Zeile als Feldnamen interpretiert, müssen diese entweder groß geschrieben werden oder es müssen bei den Feldwerten auch nicht-String Werte gefunden werden.

Im Allgemeinen sollte man auf GuessFormat lieber verzichten, da das Ergebnis nicht wirklich stabil ist. Wenn man das Format kennt, trägt man es besser im Reader.DataDef korrekt ein.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
298 Beiträge
 
#5

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 24. Okt 2022, 16:14
Damit GuessFormat die erste Zeile als Feldnamen interpretiert, müssen diese entweder groß geschrieben werden oder es müssen bei den Feldwerten auch nicht-String Werte gefunden werden.

Im Allgemeinen sollte man auf GuessFormat lieber verzichten, da das Ergebnis nicht wirklich stabil ist. Wenn man das Format kennt, trägt man es besser im Reader.DataDef korrekt ein.
Woher hast du die Informationen für GuessFormat? Ich finde in der Hilfe von Emba leider nur sehr spärliche Informationen. Mein Ziel ist es ja eigentlich auch nur mir ein bisschen Arbeit zu sparen. Ich mache mit GuessFormat die Datadefs in dem Reader voll und dann passe ich alles an, was nicht passt (Datum,Bool, etc.), der Rest, der ordentlich erkannt wird, kann ja weiter über GuessFormat laufen. Oder siehst du das anders.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#6

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 24. Okt 2022, 16:38
Woher hast du die Informationen für GuessFormat?
Die Sourcen natürlich.
Delphi-Quellcode:
      // When a value is upper-cased, this is a "good" sign, that
      // the value is field name
      if not CheckSet(sItem, ['A'..'Z', '_'], ['A'..'Z', '0'..'9', '_', '#', '$']) then
        lFieldNamesUC := False;

...

    // Final guess about first line
    DataDef.WithFieldNames := lFieldNames and (not lAllStrings or lFieldNamesUC);
Ich mache mit GuessFormat die Datadefs in dem Reader voll und dann passe ich alles an, was nicht passt (Datum,Bool, etc.), der Rest, der ordentlich erkannt wird, kann ja weiter über GuessFormat laufen. Oder siehst du das anders.
Das kannst du natürlich machen. In dem Fall solltest du den Reader bzw. Writer aber lieber nicht anonym anlegen, da du dann eben nicht so einfach an die entsprechenden Properties kommst.
Delphi-Quellcode:
       with TFDBatchMoveTextReader.Create(lBatchmove) do

...

        with TFDBatchMoveDataSetWriter.Create(lBatchmove) do
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
298 Beiträge
 
#7

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 24. Okt 2022, 16:44
[QUOTE=Uwe Raabe;1513741]
Woher hast du die Informationen für GuessFormat?
Die Sourcen natürlich.
Delphi-Quellcode:
      // When a value is upper-cased, this is a "good" sign, that
      // the value is field name
      if not CheckSet(sItem, ['A'..'Z', '_'], ['A'..'Z', '0'..'9', '_', '#', '$']) then
        lFieldNamesUC := False;

...

    // Final guess about first line
    DataDef.WithFieldNames := lFieldNames and (not lAllStrings or lFieldNamesUC);
wie kommst du an die Source. Bei mir ist nach dem interface ( IFDBatchMoveReader = interface(IFDBatchMoveDriver) ) Schluss.
Ich befürchte ich stell mich grad richtig doof dran
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#8

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 24. Okt 2022, 17:13
wie kommst du an die Source.
Strg-Klick auf TFDBatchMoveTextReader -> GuessFormat .

Übrigens: Du setzt dort nach dem Create zwar die DataDef-Eigenschaften, die werden aber bei GuessFormat wieder überschrieben. Du solltest also das GuessFormat nach dem Setzen von FileName aber vor den Einstellungen von DataDef aufrufen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
298 Beiträge
 
#9

AW: CSV Textdatei in Memtable laden und mit Query abfragen

  Alt 25. Okt 2022, 09:14
wie kommst du an die Source.
Strg-Klick auf TFDBatchMoveTextReader -> GuessFormat .

Übrigens: Du setzt dort nach dem Create zwar die DataDef-Eigenschaften, die werden aber bei GuessFormat wieder überschrieben. Du solltest also das GuessFormat nach dem Setzen von FileName aber vor den Einstellungen von DataDef aufrufen.
Danke. Heute Morgen hab ich die Kommentare dann auch gesehen/gefunden. Kaffee sei dank
Über die Sinnhaftigkeit der Definition, was eine Überschrift ist, lässt sich sicher streiten, aber das hat mir schon mal sehr weiter geholfen.
Vielen Dank, Top-Hilfestellung wie immer

Ps.: Danke für den Hinweis mit den DataDef Eigenschaften. Hatte ich zwischenzeitlich sogar schon geändert und die Eigenschaft sogar um eine kleine Helper Class erweitert, damit ich mir das Geschachtel bei der Prüfung auf Nil spare.

Delphi-Quellcode:
type
  TFDTextFieldHelper = class helper for TFDTextField
  private
    function getter: TFDTextDataType;
    procedure setter(const Value: TFDTextDataType);
  published
    property DataTypeNilSafe: TFDTextDataType read getter write setter;
  end;

....

{ TFDTextFieldHelper }

function TFDTextFieldHelper.getter: TFDTextDataType;
begin
  if Self <> nil then
    result := Self.DataType
end;

procedure TFDTextFieldHelper.setter(const Value: TFDTextDataType);
begin
  if Self <> nil then
    Self.DataType := Value;
end;

...

Geändert von fisipjm (25. Okt 2022 um 09:17 Uhr)
  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 17:11 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