Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1824to1828
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Auslesen der Jahreszahlen aus Textzellen

Auslesen der Jahreszahlen aus Textzellen
19.04.2021 20:33:32
mjberger
Moin,
ich habe aus einem Datenexport in Excel folgende Datenstruktur:
{"birthyear":2001,"zipcode":"69123","city":"Heidelberg","income":3000},{"birthyear":1994,"zipcode":"10318","city":"berlin"},{"birthyear":1986,"zipcode":"12203","city":"Berlin"},{"birthyear":1997,"zipcode":"12109","city":"Berlin","income":1200},
Das sind die Daten von Bewerbern auf eine Wohnung. Diese stehen alle in einer Zelle. Ich würde gerne das Durchschnittsalter aller Bewerber ermitteln. Gibt es eine Möglichkeit alle Zahlenwerte nach dem string "birthday" auszulesen?.
Mit Dank und freundlichem Gruß,
Merlin Berger

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
GLÄWEXWDH
19.04.2021 21:26:56
lupo1
B1:
=MITTELWERT(WENNFEHLER(--GLÄTTEN(TEIL(WECHSELN(WECHSELN(WECHSELN(
WECHSELN(A1;"""";);"ear:";" ");",zip";" ");" ";WIEDERHOLEN(" ";599));SPALTE(A1:Z1)*2*599-598;599));""))

ist hinsichtlich der Anzahl der "Datensätze in Zelle" stark beschränkt. Dafür aber klappt diese Formel auch vor xl2013.
__________
=XMLFILTERN() (aufgespürt von shift-del, ab 2013) ist hingegen nicht beschränkt (außer auf den Zellinhalt mit 32767 Zeichen).
https://www.office-hilfe.com/support/threads/string-oder-csv-mit-trennzeichen-per-formel-auf-zellen-aufteilen.22254/
__________
Mit LAMBDA()-Split geht es etwas weniger kryptisch: https://www.clever-excel-forum.de/thread-29660.html
Anzeige
AW: Auslesen der Jahreszahlen aus Textzellen
19.04.2021 22:10:19
Yal
Hallo Merlin,
trotz bereits gegebene Antwort von Lupo, hier eine VBA-Variante (vielleicht leichter zu erklären, falls Du die Lösung dein Lehrer vortragen möchtest ;-)
Erst die Version "wir nehmen den JSON schön brav auseinander". Schöner wäre mit der Verwendung einer JSON-Library.
Die rabiatte Version unten.

Const T = "{""birthyear"":2001,""zipcode"":""69123"",""city"":""Heidelberg"",""income"":3000},{""birthyear"":1994,"" _
zipcode"":""10318"",""city"":""berlin""},{""birthyear"":1986,""zipcode"":""12203"",""city"":""Berlin""},{""birthyear"":1997,""zipcode"":""12109"",""city"":""Berlin"",""income"":1200}"
Private Type Bewerber
Geburtsjahr As Integer
PLZ As String
Stadt As String
Einkommen As Integer
End Type
Public Sub Test()
Debug.Print "Durchschnittsalter ist: " & Durchschnittsalter(T)
End Sub
Private Function Durchschnittsalter(T As String) As Single
Dim E
Dim A, i
Dim B() As Bewerber
Dim S As Single
A = Splitter(T, "{", "}")
ReDim B(UBound(A))
For i = 0 To UBound(A)
For Each E In Split(A(i), ",")
Select Case Split(E, ":")(0)
Case """birthyear""": B(i).Geburtsjahr = Split(E, ":")(1)
Case """zipcode""":  B(i).PLZ = Split(E, ":")(1)
Case """city""":     B(i).Stadt = Split(E, ":")(1)
Case """income""":   B(i).Einkommen = Split(E, ":")(1)
End Select
Next
Next
For i = 0 To UBound(B)
S = S + Year(Now) - B(i).Geburtsjahr
Next
Durchschnittsalter = S / (UBound(B) + 1)
End Function
Private Function Splitter(Text As String, Lefter As String, Righter As String)
Dim A(), i
Dim Anfang, Ende
Dim An As Boolean
Do
If Not An Then
Anfang = InStr(i + 1, Text, Lefter)
An = True
Else
Ende = InStr(i + 1, Text, Righter)
An = False
End If
If Not An Then
ReDim Preserve A(Ubound0(A) + 1)
A(UBound(A)) = Mid(Text, Anfang + 1, Ende - Anfang - 1)
i = Ende
End If
i = i + 1
Loop While i 

Weniger zimperlich geht es mit.

Const T = "{""birthyear"":2001,""zipcode"":""69123"",""city"":""Heidelberg"",""income"":3000},{""birthyear"":1994,"" _
zipcode"":""10318"",""city"":""berlin""},{""birthyear"":1986,""zipcode"":""12203"",""city"":""Berlin""},{""birthyear"":1997,""zipcode"":""12109"",""city"":""Berlin"",""income"":1200}"
Sub rechne()
Dim S, C, pos
Do
pos = InStr(pos + 1, T, "birthyear")
If pos > 0 Then
S = S + 2021 - CInt(Mid(T, pos + 11, 4))
C = C + 1
End If
Loop While pos > 0
Debug.Print "Durchschnittsalter ist : " & S / C
End Sub

VG
Yal
Anzeige
AW: Auslesen der Jahreszahlen aus Textzellen
19.04.2021 23:31:25
Yal
Hallo Merlin,
Vielleicht noch schöner... auf alle Fälle leichter:

' WICHTIG: mit Verweis (Extras >> Verweise...) auf
' Microsoft Scripting Runtime
Const T = "{""birthyear"":2001,""zipcode"":""69123"",""city"":""Heidelberg"",""income"":3000},{""birthyear"":1994,"" _
zipcode"":""10318"",""city"":""berlin""},{""birthyear"":1986,""zipcode"":""12203"",""city"":""Berlin""},{""birthyear"":1997,""zipcode"":""12109"",""city"":""Berlin"",""income"":1200}"
Public Sub Test()
Dim A, E, S
A = Trenner(T)
For Each E In A
S = S + 2021 - E("birthyear")
Next
Debug.Print "Durchschnittsalter ist: " & S / (UBound(A) + 1)
End Sub
Private Function Trenner(ByVal Text As String)
Dim A, i, E
Dim B() As Dictionary
Text = Replace(Text, "},{", "}|{")
Text = Replace(Text, "{", "")
Text = Replace(Text, "}", "")
Text = Replace(Text, """", "")
A = Split(Text, "|")
ReDim B(UBound(A))
For i = 0 To UBound(A)
Set B(i) = New Dictionary
For Each E In Split(A(i), ",")
B(i)(Split(E, ":")(0)) = Split(E, ":")(1)
Next
Next
Trenner = B
End Function

Verweis auf dem Microsoft Scripting Runtime nicht vergessen (wegen Dictionary).
VG
Yal
(manche haben Ihren Spass mit Sudoku...)
Anzeige
AW: Auslesen der Jahreszahlen aus Textzellen
19.04.2021 23:55:11
mjberger
Guten Abend Yal,
vielen Dank für deine Antwort. Ich habe hier leider immer das Problem, dass er mir bei Const T einen Syntaxfehler ausgibt. Liegt es daran, dass die einzelnen Matrizen (also die innerhalb der geschweiften Klammern) nicht immer die gleiche Anzahl von Zeilen und Spalten besitzen? Denn manchmal fehlt auch das income usw. oder liegt es daran, dass birthyear als integer und das income als string definiert ist?
Mit Danke und freundlichem Gruß,
mjberger
AW: Auslesen der Jahreszahlen aus Textzellen
20.04.2021 08:40:49
Yal
Hallo Merlin,
das erste liegt daran, dass die Forum-Software die lange Zeile in VBA-Form mit einem " _ " unterbricht. Diese muss nachfassen per Hand.
Das zweite ist nicht ein Problem der Unvollständigkeit. Ich habe 2 Versionen. Die zweite mit der Dictionary ist die anpassungsfähigste und neue oder fehlende Etiketten (JSON-Properties) sollten kein Problem sein. Lasst den Code in Schritt-Modus laufen (F8) beim offene Lokal-Fenster (Ansicht, Lokal-Fenster). So kannst Du die Stände der Variablen beobachten und besser verstehn, was da passiert.
VG
Yal
Anzeige
AW: Auslesen der Jahreszahlen aus Textzellen
20.04.2021 13:15:29
mjberger
Moin Yal,
vielen Dank für deine Antwort, das war das Problem und der Schrittmodus mit F8 funktioniert auch gut. Ich kann auch sehen, dass der Code einwandfrei durchläuft und kann auch den Wert der Variablen einsehen. Ich hätte erwartet, dass unter dem Ausdruck
Debug.Print "Durchschnittsalter ist: " & S / (UBound(A) + 1)
ein Durchschnittsalter ausgegeben wird. Da passiert leider noch nichts. War das so von dir angedacht?
VG,
Merlin
AW: Auslesen der Jahreszahlen aus Textzellen
20.04.2021 13:48:55
Yal
ach so: debug.print liefert Ergebnisse im Direkt-Fenster (Strg+g)

325 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige