![]() |
Datenbank: MSSQL • Version: xxx • Zugriff über: Firedac
TFDBatchMove scheitert an korrekter PLZ erkennung
Hallo,
folgende Aufgabenstellung, die ich eigentlich für wahnsinnig simpel gehalten habe: Importiere eine CSV Datei mit x Spalten in eine Tabelle einer MS SQL Datenbank. Behandle die Daten entsprechend verschiedener vorgaben, erstelle Verknüpfungen in der Datenbank, bliblablub Soweit so einfach. Ich hab mir gedacht "hey Wahnsinn, wenn Delphi mit schon so tolle Komponenten zur Verfügungs stellt wie TFDBatchmove, TFDBatchMoveTextReader und TFDBatchMoveDatasetWriter" warum nutz ich die nicht einfach. Also alle komponenten auf die Form geschmissen, inkl. FDConnection und lSQL komponente um direkt eine Query auf den Dataset machen zu können (Die Zuordnung der Felder soll später dynamisch über die SQL Abfrage laufen also alla "Select AltesFeldInCSV as ZielFeldInMSDEDB from localDataset"). Folgendes Phänomen: Die Batchmove Komponenten hat eine wunderbare Funktion die sich schimpft "FormatGuessing". Dabei wir die Date Analysiert und im Reader Autoamtisiert Felder angelegt und mit einem entsprechenden Datetyp versehen. Woran der Reader kläglich Scheitert, ist es eine Simple PLZ korrekt zu analysieren. Beispiel meiner PLZs 12345 54321 23451 01234 87654 Das Format erkennt er mit den als LongInt und schneidet mir bei dem 01234 die 0 ab, weil LongInt logisch. Da es nunmal eine deutsche Liste ist, gibt es leider keine Buchstaben. Ich habe keine Möglichkeit gefunden den Batchmove dazu zu überreden, mir das richtige Format rauszuspuken. (In meinen Augen, String) Habt ihr Ideen, Vorschläge? Bin für alles offen. |
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Das das GuessFormat zur Laufzeit durchgeführt wird, kannst du das Ergebnis auch nur per Code nachträglich anpassen. Angenommen das Feld heißt PLZ, dann kannst du das mit
Delphi-Quellcode:
machen.
BatchReader.DataDef.Fields.FieldByName('PLZ').DataType := atString
|
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Zitat:
das hab ich auch schon befürchtet. Ich verstehe nur nicht das die Zahl 01234 als Integer erkannt wird. Ja, es sind nur Zahlen, aber es wäre doch ein leichtes bei einer führenden 0 die Erkennung auf String zu setzen. In meinen Augen ein Bug im System. |
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Hmm..
CSV-Import ist immer so eine Sache.. Gerade z.B. Excel versucht immer die 'Werte' zu 'Deuten' und macht aus Zahlen auch gerne Datumsangaben. Wahrscheinlich verendet hier MS-SQL die gleichen Routinen / Libs! Woher hast Du die CSV? Generell sollte schon bei der Erstellung der CSV am besten darauf geachtet werden, dass Stings (Text) immer in ".." gesetzt wird. Dann ist die Fehlerquote durch 'Falsch Interpretation' geringer. Hierzu kommt: PLZ sind keine (Integer) Zahlen!! Es werden nur in den meisten Ländern ausschließlich Ziffern hierfür verwendet. Gerade an der Führenden '0' zu erkennen, welche es bei einer richtigen Zahl nicht gibt (außer alleine direkt vor dem Komma). Es sollte ein String in der DB (".." bei CSV) verwendet werden, da in anderen Länder nicht nur Buchstaben, sondern auch Bindestriche innerhalb verwendet werden. Auch ist die Länge Weltweit unterschiedlich und nicht immer 5 Ziffern. ![]() Meine Erfahrung mit CSV: Wenn Du einen sauberen Import willst, dann mach in selber und verwende keine MS Routinen... ;) |
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Zitat:
|
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Zitat:
Folgende Beispiele: 0 = Integer 00= String 12= Integer 01= String im Prinzip muss er mir immer wenn ich eine führende 0 hab das Teil als String interpretieren weil alles andere Datenverlust bedeuten würde. |
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Zitat:
Zitat:
Und was glaubst Du, was das Formatraten macht? Es prüft vermutlich, ob sich alle Werte in ein Integer oder Float verwandeln lassen. Vielleicht sogar nur bei einem Teil der Daten und nicht bei allen 50 oder 100T Records. Und zuletzt, wenn Du das Format kennst, wieso lässt Du es raten? |
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Ich kenne mich mit der Komponente nicht aus, vielleicht kannst Du auch ein simples "str := Format('%.*d, [5, PlzInteger]);" um deine Zahlen immer als 5-stellig darzustellen dazwischen quetschen?
|
AW: TFDBatchMove scheitert an korrekter PLZ erkennung
Zitat:
Ich glaube du hast mich falsch verstanden. Ich will das es als String erkannt wird wenn eine führende 0 existiert. Man kann der Komponente sagen wie viele Sampels ich aus der Datei haben will, die kenne ich, ich weis ja wie lange die Datei ist wenn ich sie hab. Das eine Zahl (Unabhängig ob PLZ oder was anderes) mit einer führenden 0 keinem Integer entspricht ist doch eigentlich nachvollziehbar oder? Natürlich kann man argumentieren "Es sind aber alles Zahlen und ich kann es in ein Integer Werfen". Um es mal in die Reale welt zu bringen, wenn jemand kommt und wirft dir 500 ° ohne Skala Einheit an den Kopf kannst du ja trotzdem auch schon drauf schließen, dass es sich hier wahrscheinlich nicht um eine Winkelangabe handelt. Genau so sollte ein Guessing in der Lage sein zu erkkenen das eine Zahl mit einer Führenden 0 kein Integer ist! Das Guessing mache ich weil ich das Format nicht kenne. Das waren nur Testdaten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz