AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TFDBatchMove scheitert an korrekter PLZ erkennung
Thema durchsuchen
Ansicht
Themen-Optionen

TFDBatchMove scheitert an korrekter PLZ erkennung

Ein Thema von fisipjm · begonnen am 3. Mär 2022 · letzter Beitrag vom 10. Mär 2022
Antwort Antwort
Seite 1 von 2  1 2      
fisipjm

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

TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 3. Mär 2022, 16:55
Datenbank: MSSQL • Version: xxx • Zugriff über: Firedac
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 3. Mär 2022, 17:52
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 BatchReader.DataDef.Fields.FieldByName('PLZ').DataType := atString machen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

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

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 7. Mär 2022, 08:03
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 BatchReader.DataDef.Fields.FieldByName('PLZ').DataType := atString machen.
Hallo Uwe,

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.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#4

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 7. Mär 2022, 09:59
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.

https://de.wikipedia.org/wiki/Liste_der_Postleitsysteme

Meine Erfahrung mit CSV:
Wenn Du einen sauberen Import willst, dann mach in selber und verwende keine MS Routinen...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 7. Mär 2022, 10:08
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.
Also einen Bug würde ich das nicht nennen. Eine durchaus valide Erkennung auf Integer oder nicht könnte z.B. durch TryStrToInt erfolgen. Die von dir vorgeschlagene Methode würde ja bei lauter 0-Werten (zumindest in den zu analysierenden N Zeilen) auch nicht eindeutig zum Ziel führen. Man müsste dazu wohl auch noch prüfen, ob alle Einträge die gleiche Anzahl Ziffern haben. Ich sehe da schon eine sehr spezielle Anforderung für deinen Fall, die eine Verallgemeinerung wohl nicht rechtfertigt. Aber man kann das ja eben durch gezieltes Eingreifen lösen. Es heißt ja auch nicht umsonst nur GuessFormat.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#6

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 9. Mär 2022, 14:46
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?
Vom Kunden.

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.
Die sind schon froh wenn Sie es so hin bekommen.


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.
Meinen Post haste vorher aber schon mal gelesen oder? Das ist doch das was ich beschrieben habe

Meine Erfahrung mit CSV:
Wenn Du einen sauberen Import willst, dann mach in selber und verwende keine MS Routinen...
Den müsstest du mir erklären, in wie fern wären hier MS Routinen beteiligt?
  Mit Zitat antworten Zitat
fisipjm

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

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 9. Mär 2022, 14:51
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.
Also einen Bug würde ich das nicht nennen. Eine durchaus valide Erkennung auf Integer oder nicht könnte z.B. durch TryStrToInt erfolgen. Die von dir vorgeschlagene Methode würde ja bei lauter 0-Werten (zumindest in den zu analysierenden N Zeilen) auch nicht eindeutig zum Ziel führen. Man müsste dazu wohl auch noch prüfen, ob alle Einträge die gleiche Anzahl Ziffern haben. Ich sehe da schon eine sehr spezielle Anforderung für deinen Fall, die eine Verallgemeinerung wohl nicht rechtfertigt. Aber man kann das ja eben durch gezieltes Eingreifen lösen. Es heißt ja auch nicht umsonst nur GuessFormat.
Ich fände das beschriebene Vorgehen eigentlich recht logisch.
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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 9. Mär 2022, 15:41
.. 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.
.. haste vorher aber schon mal gelesen oder?
Was erwartest Du? Dass die Formatrate Funktion berücksichtigt, dass es nur Deutsche Städte in der Liste ergibt? "ach sie mal, Dresden, Köln, Berlin, ..alles Deutsche Städte, dann ist die Spalte hier bestimmt ne PLZ und die sind in D auch mit führender Null", weil Formatraten auch die Internationalen PLZ Regeln kennt?
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?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 9. Mär 2022, 16:32
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?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#10

AW: TFDBatchMove scheitert an korrekter PLZ erkennung

  Alt 10. Mär 2022, 07:59
.. 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.
.. haste vorher aber schon mal gelesen oder?
Was erwartest Du? Dass die Formatrate Funktion berücksichtigt, dass es nur Deutsche Städte in der Liste ergibt? "ach sie mal, Dresden, Köln, Berlin, ..alles Deutsche Städte, dann ist die Spalte hier bestimmt ne PLZ und die sind in D auch mit führender Null", weil Formatraten auch die Internationalen PLZ Regeln kennt?
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?
Moin,
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:38 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