Free Trial

Blog - Deutsch

Erkenntnisse und Ideen von den besten Analytics-Experten.
RolandSchubert
16 - Nebula
16 - Nebula

Diese (oder eine ähnliche) Fehlermeldung ist bestimmt jedem mal schon begegnet: "Invalid type in operator >". Eigentlich will man nur Datensätze auswählen, die einen bestimmten Wert (in diesem Fall 1000) überschreiten - und dann das:  

P001.jpg

Dabei sieht der Inhalt des Felds [Umsatz] doch sehr nach einer Zahl aus, oder?

 

P002.jpg 

 

Und jetzt? Ein kleine Änderung in der Bedingung, dann ist die Fehlermeldung verschwunden:

 

P007.jpg

 

Allerdings erhalten wir jetzt nicht mehr das gewünschte Ergebnis - jetzt werden nicht mehr Zahlenwerte abgefragt, die größer sind als 1000, sondern wir vergleichen Texte und bei diesem Vergleich erfüllt dann plötzlich auch 783,20 die Bedingung.

 

 

Vielleicht geht es auch darum, der Kundennummer einen Prefix zu verpassen, also beispielsweise ein "KND" vor die Nummer zu stellen. Einfach den Text "KND" und das Feld [Kunde] verknüpfen - mit einem "+" ist das doch ohne Probleme möglich? Leider passiert dann das:

 

P008.jpg

 

Schon wieder ein Fehler, der etwas mit dem "Type" zu tun hat - genauer gesagt, mit dem Data Type.

 

Tatsächlich kommt es in manchen Fällen doch darauf an, ob wir ein Textfeld (String Data) oder ein numerisches Feld (Numeric Data) vor uns haben - und das gilt natürlich auch für Datums- oder Zeitfelder (DateTime Data),  boolsche Felder und erst recht für geografische Objekte (Spatial Data).

 

Eine Bedingung, die den Zahlenwert verwendet, funktioniert nur, wenn wir ein numerisches Feld vor uns haben; auch eine Reihe von Operationen wie etwa SUM oder AVERAGE im Summarize Tool lassen sich nur auf numerische Felder anwenden, während etwa CONCATENATE nur bei Textfeldern geht, auch das FindReplace Tool erwartet für das "FIND" Textfelder. Besonders genau nehmen es die Predictive Tools - hier kann man viele Fehler vermeiden, indem man den richtigen Datentyp  liefert.

 

Etwas weniger genau nimmt es das Join Tool, hier kommt es nur darauf an, dass die Join Fields auf beiden Seiten den gleichen Datentyp haben. 

 

Aber wie sorgen wir nun dafür, dass der "richtige" Datentyp geliefert wird? Wie wandelt man Daten von einem Datentyp in einen anderen um? Es gibt wie fast immer eine ganze Reihe von Möglichkeiten, einige möchte ich kurz vorstellen. 

 

 

1. Das Select Tool

 

Ganz einfach geht die Umwandlung von Datentypen mit dem Select Tool. Wenn wir zum Beispiel über das Input Data Tool eine csv-Datei importieren und damit ein Select Tool verbinden, zeigt uns das Select Tool die Datentypen an, die nach dem Import vorliegen:

 

P004.jpg 

 

Diese Datentypen können wir über das Select Tool anpassen. Das Feld [Kunde] enthält eine Kundennummer, die setzen wir auf Int16, einen ganzzahligen Wert, [Datum] ist selbstverständlich ein Date und [Umsatz] sieht nach einer Dezimalzahl aus, hier verwenden wir Double. Das Ergebnis entspricht allerdings nicht so ganz unseren Erwartungen:

 

P005.jpg

 

Beim Feld [Kunde] scheint es funktioniert zu haben, aber die Umwandlung der beiden anderen Felder waren weniger erfolgreich: [Datum] enthält nur noch NULL Werte, beim [Umsatz] sehen die Zahlen auf den ersten Blick zwar ähnlich aus, unterscheiden sich aber doch deutlich - aus 1.786,02 wird 1,78602. 

 

Okay, die Auswahl der Daten, deren Datentypen wir hier umgewandelt haben, war vielleicht nicht ganz fair. Bei ganzzahligen Werten ohne Formatierung (z.B. Tausendertrenner) funktioniert die Änderung problemlos, und zwar in beide Richtungen (also Integer in String oder String in Integer). Auch bei Dezimalzahlen mit "." als Dezimaltrenner und ohne Tausendertrenner gibt es keine Schwierigkeiten, auch da in beide Richtungen. In unserem Beispiel haben wir es mit Problemfällen zu tun, die sich mit dem Select Tool nicht richtig umstellen lassen - für formatierte Dezimalzahlen und Datumswerte müssen wir uns also einen anderen Weg einfallen lassen.   

 

Also: Datentypen mit dem Select Tool ändern kann zwar funktionieren - muss es aber nicht. 

 

 

2. Das Formula Tool

 

 Mit dem Formula Tool haben wir deutlich ausgefeiltere Werkzeuge zur Verfügung. Drei Funktionen helfen uns hier weiter.

 

Für die Umwandlung von formatierten Dezimalzahlen, die als Text angeliefert werden, können wir die Funktion ToNumber nutzen.

Schauen wir uns diese Funktion mal etwas genauer an:

P006.jpg

1:  Wir nutzen die Funktion, um ein neues Feld zu ermitteln - das Formula Tool kann den Datentyp eines existierenden Felds nicht ändern

2: Natürlich müssen wir das Feld angeben, das die Ursprungsdaten enthält

3: Der Zieldatentyp, mit dem das neue Feld angelegt wird

4: Fehler bei der Umwandlung anzeigen (eine Warnung wird ausgegeben, der Parameter "0" sorgt dafür, dass Fehler unterdrückt werden

5: Was passiert mit Werten, die nicht umgwandelt werden können (z.B. Texte oder NULL)? Die "1" sorgt dafür, dass diese Inhalte in NULL umgewandelt werden. der Parameter "0"   führt zur Umwandlung in einen Nullwert (0). Achtung: "abc1" wird zu NULL oder 0, aus "1abc" wird 1.

6: Welcher Dezimaltrenner wird verwendet ("." oder ","). Die "übrigen" Trenner (von "." und ","  das jeweils nicht als Dezimaltrenner benutzte Zeichen sowie das Leerzeichen) werden ignoriert.

 

Wenn wir das jetzt auf unser Beispiel anwenden, erhalten wir genau die gewünschten Ergebnisse, allerdings in einem neuen (zusätzlichen) Feld:

 

P009.jpg

 

Das können wir nun über ein Select Tool korrigieren - einfach das ursprüngliche Feld [Umsatz] entfernen und das neue Feld umbenennen:

 

P010.jpg

 

Damit haben wir unser numerisches Feld [Umsatz], für das wir nun das Filter Tool wie geplant nutzen können, auch Summen lassen sich jetzt bilden.

 

Mitunter benötigen wir aber auch den umgekehrter Weg, müssen aus einer Zahl (einem numerischen Feld) ein Textfeld erzeugen. Hier hilft die Funktion ToString.

 

P015.jpg

1: Wir benötigen einen neuen Feldnamen (anderer Feldtyp = neues Feld)

2: Der Typ des neuen Felds, hier könnte auch ein anderer Text-Datentyp benutzt werden

3: Das Ursprungsfeld ([Kunde] ist hier ein INT-Feld)

4: Anzahl von Dezimalstellen, in diesem Fall benötigen wir keine)

5: Soll ein Tausendertrenner verwendet werden - falls wir den wollen, ist der Parameter "1"

6: Dezimaltrenner ("," oder "."), der jeweils andere wird als Tausendertrenner verwendet, wenn der gewünscht wird.

 

So können wir zum Beispiel das Textfeld für unsere Kundennummer erzeugen; die Funktion ist aber auch hilfreich, wenn formatierte Zahlen ausgegeben werden sollen.

 

 

Ähnlich können wir auch die Umwandlung für das Feld [Datum] erledigen. Dazu benötigen wir die Funktion DateTimeParse, die aus einem Textfeld ein Feld mit dem Datentyp Date (nur Datum), Time (nur Zeit) oder DateTime (Datum und Zeit) erzeugt.

 

Das sieht dann etwa so aus:

 

P012.jpg 

 

1: Der Name des neuen Feldes - da wir einen anderen Feldtyp brauchen, müssen wir wieder ein neues Feld anlegen.

2: Als ersten Parameter braucht die Funktion das Ausgangsfeld - das muss ein Text-Datentyp sein (String, V_String, WString, V_WString)

3: Der zweite Parameter ist das Ausgangsformat, hier hat das Datum den Aufbau TT.MM.JJJJ, die entsprechenden "Kürzel" liefern dafür die Übersetzung , %Y steht etwa für eine vierstellige Jahreszahl.

4: Der Datentyp, den das neue Feld haben soll, hier einfach "Date".

 

Wenden wir diese Formel nun aus unser Beispiel an, erhalten wir das korrekte Datumsformat:

 

P013.jpg

 

Jetzt können wir wieder das Originalfeld entfernen uns das neue Feld umbenennen, wie oben schon gezeigt.

 

Alternativ könnten wir übrigens auch das DateTime Tool benutzen, das für die Umwandlung von Textfeldern in Datumsfelder und den umgekehrten Weg genutzt werden kann:

 

P014.jpg

 

Natürlich müssen wir auch hier das Ursprungsfeld wählen. Dann können wir die "DateTime Language", also das regionale Format für Zeitangaben, festlegen und erhalten abhängig  von unserer Auswahl eine Liste der am häufigsten benötigten Formatvorlagen, aus denen wir dann wählen können. Das Ergebnis ist identisch, ob man eine Formel oder das DateTime Tool nutzt, ist eine Frage des persönlichen Geschmacks.

 

 

3. Das Multi-Field Formula Tool

 

Wenn wir das Formula Tool nutzen, erzeugen wir bei der Änderung des Datentyps immer ein neues Feld und müssen im Anschluss dann gegebenenfalls das Originalfeld entfernen und das neue Feld umbenennen. Ein Alternative ist hier das Multi-Field Formula Tool, mit dem wir den Datentyp eines existierenden Felds ändern können.

 

Die Umwandlung des Textfelds in ein numerisches Feld würde dann so aussehen:

 

P016.jpg

 

Wir wählen gezielt das Feld (oder die Felder), für die unsere Formel wirken soll, nehmen die Auswahl "Copy Output Fields" weg, wählen "Change Output Type"  und geben den Zieldatentyp an. Bei unserer Formel ändert sich nur eines - statt des Felds [Umsatz] wählen wir [_CurrentField_], damit wird die Operation für alle Felder ausgeführt, die wir oben gewählt haben. Besonders nützlich ist diese Methode natürlich, wenn es nicht nur ein einziges Feld gibt, das umgewandelt werden soll.

 

 

Fazit

 

Wie immer, wenn es verschiedene Möglichkeiten gibt, eine Aufgabe zu lösen, kommt es auf den konkreten Fall an. Wenn für eine Reihe von Felder die gleiche Änderung des Datentyps erfolgen soll, ist vielleicht das Mutli-Field Formula Tool eine gute Option. Geht es um mehrere Felder, für die aber jeweils andere Umwandlungen notwendig sind, würde ich eher das Formula Tool benutzen und im Anschluss mit einem Select Tool "aufräumen". Die Änderung von Datentypen mit dem Select Tool nutze ich natürlich auch - aber nur, wenn ich ganz sicher bin, dass es für den Einzelfall auch passt (also etwa, wenn ein ganzzahliger Wert in ein Text-Datentyp umgewandelt werden muss). 

 

 

Weitere Tipps Tuesday Beiträge

Dieser Eintrag ist Teil der Tipps Tuesday-Serie, alle Einträge dieser Serie findest du in unserem Index aufgelistet.

  

 

Kommentare
ASTX
Meteoroid

Hallo Roland,

 

ich versuche den Vorschlag Nr. 2 über das Formel-Tool umzusetzen. Ich kann aber den Data-Type nicht auswählen, diese bleibt ausgegraut, egal an welcher Stelle ich das Element in der Verarbeitung setze. Gibt es eine anderweitige Voraussetzung für eine Auswahl des Datentyps?

 

Gruß

Andreas

 

EDIT: wer lesen kann. Man muss dafür ein neues Feld anlegen, dann kommt die Auswahl :)

Beschriftungen