Bedingt bestimmte Daten aus Messreihe einlesen

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von juliasjulian.

    Bedingt bestimmte Daten aus Messreihe einlesen

    Hallo zusammen,

    ich habe ein Problem, das ich alleine nicht lösen kann.
    Ich habe eine Messreihe aus Kameradaten in Textformat und brauche diese zur Diagrammerstellung in Excel. Das sieht folgendermaßen aus:

    1 erkannte Geste
    2015-03-23 16:02:01.710712059
    RightUpLeftPoint 317.291
    Zeigepunkt 3D X: 883.757 mm Y: -102 mm Z: 1485.76 mm

    2 erkannte Geste
    2015-03-23 16:02:01.710712059
    RightUpLeftPoint 317.291
    Zeigepunkt 3D X: 866.757 mm Y: -102 mm Z: 1490.76 mm

    usw...

    jetzt brauche ich getrennt die Zahlen der 3. und 4. Zeile jeweils, jedoch nur zu bestimmten Uhrzeiten (2. Zeile), da viele Daten zu Uhrzeiten aufgenommen werden, die die Diagramme verfälschen.

    was kann ich da tun?

    Ich danke im vorraus für jede Hilfe, habe gestern zum ersten Mal das Wort VBA gelesen...
    Julian
    Der Zeitcode ist bei beiden Einträgen identisch und scheint die Minute nochmal in eine neunstellige Einheit zu unterteilen. Was ist die Quelle der Daten und wieviel Daten sind es? Ist der Aufbau immer gleich, dann lässt es sich doch prima einlesen. Nach dem Wort "Geste" folgen drei Zeilen Daten. Die lassen sich einfach oder etwas umständlicher zerlegen. Je nachdem, ob die Stellen immer gleich sind oder variieren.

    Edit:
    Eine evtl. Lösung hätte ich. Ob sie zu Deinem Problem passt, weiß ich nicht.

    Ich würde einen Typ definieren, welche die verlangten Felder beinhaltet.

    Quellcode

    1. Private Type tDaten
    2. Geste As Long
    3. Zeit As Date
    4. RuL As Single
    5. X As Single
    6. Y As Single
    7. Z As Single
    8. End Type


    Dann die Daten in ein Array vom Typ tDaten zerlegen.
    Das kann man erstmal komplett machen, oder dabei schon die schlechten Uhrzeiten weglassen. Je nachdem, ob die Daten evtl. doch noch gebraucht werden und welche Menge da anfällt.
    Zum Zerlegen der Daten helfen instr, left$, mid$ und ein paar Hilfsvariablen, welche der Übersicht dienen.

    Ergebnis wäre dann das:

    1|23.03.2015 16:02:01|317,291|883,757|-102|1485,76
    2|23.03.2015 16:02:01|317,291|866,757|-102|1490,76


    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. 'Beispiel Zusammenfassen eines Datensatzes von mehreren Zeilen
    3. Const Daten = "1 erkannte Geste" & vbCrLf & _
    4. "2015-03-23 09:02:01.710712059" & vbCrLf & _
    5. "RightUpLeftPoint 317.291" & vbCrLf & _
    6. "Zeigepunkt 3D X: 883.757 mm Y: -102 mm Z: 1485.76 mm" & vbCrLf & _
    7. vbCrLf & _
    8. "2 erkannte Geste" & vbCrLf & _
    9. "2015-03-23 16:02:01.710712059" & vbCrLf & _
    10. "RightUpLeftPoint 317.291" & vbCrLf & _
    11. "Zeigepunkt 3D X: 866.757 mm Y: -102 mm Z: 1490.76 mm"
    12. Private Type tDaten
    13. Geste As Long
    14. Zeit As Date
    15. RuL As Single
    16. X As Single
    17. Y As Single
    18. Z As Single
    19. End Type
    20. Private Sub Datenzerlegen()
    21. Dim DatenArr As Variant
    22. Dim l As Long
    23. Dim Z As Long
    24. Dim Pos As Integer
    25. Dim startX As Integer
    26. Dim endX As Integer
    27. Dim startY As Integer
    28. Dim endY As Integer
    29. Dim startZ As Integer
    30. Dim endZ As Integer
    31. Dim wDaten() As tDaten
    32. On Error GoTo Fehler
    33. Application.ScreenUpdating = False
    34. DatenArr = Split(Daten, vbCrLf)
    35. ReDim wDaten((UBound(DatenArr) / 4))
    36. For l = 0 To UBound(DatenArr)
    37. If InStr(1, DatenArr(l), "erkannte", vbTextCompare) > 0 Then
    38. With wDaten(Z)
    39. .Geste = Val(Left$(DatenArr(l), InStr(1, DatenArr(l), "erkannte", vbTextCompare) - 1))
    40. l = l + 1
    41. .Zeit = CDate(Left$(DatenArr(l), InStr(1, DatenArr(l), ".", vbTextCompare) - 1))
    42. l = l + 1
    43. .RuL = Val(Mid(DatenArr(l), InStr(1, DatenArr(l), "Point", vbTextCompare) + 6))
    44. l = l + 1
    45. startX = InStr(1, DatenArr(l), "X:", vbTextCompare) + 2
    46. endX = InStr(startX, DatenArr(l), "mm", vbTextCompare) - startX
    47. startY = InStr(1, DatenArr(l), "Y:", vbTextCompare) + 2
    48. endY = InStr(startY, DatenArr(l), "mm", vbTextCompare) - startY
    49. startZ = InStr(1, DatenArr(l), "Z:", vbTextCompare) + 2
    50. endZ = InStr(startZ, DatenArr(l), "mm", vbTextCompare) - startZ
    51. .X = Val(Mid$(DatenArr(l), startX, endX))
    52. .Y = Val(Mid$(DatenArr(l), startY, endY))
    53. .Z = Val(Mid$(DatenArr(l), startZ, endZ))
    54. End With
    55. If Hour(wDaten(Z).Zeit) > 8 And Hour(wDaten(Z).Zeit) < 10 Then 'Entweder hier schon filtern
    56. Z = Z + 1
    57. End If
    58. End If
    59. Next
    60. Fehler: 'wahrscheinlich durch nicht kompletten oder zerstörtem Datensatz
    61. If Err.Number <> 0 Then
    62. Debug.Print "Fehler " & Err.Number & ":" & Err.Description
    63. Err.Clear
    64. End If
    65. Debug.Print "Anzahl:" & Z
    66. ReDim Preserve wDaten(Z - 1)
    67. For l = 0 To UBound(wDaten)
    68. If Hour(wDaten(l).Zeit) > 8 And Hour(wDaten(l).Zeit) < 10 Then ' oder hier erst filtern
    69. Debug.Print wDaten(l).Geste & "|" & wDaten(l).Zeit & "|" & wDaten(l).RuL & "|" & wDaten(l).X & "|" & wDaten(l).Y & "|" & wDaten(l).Z
    70. End If
    71. Next
    72. Application.ScreenUpdating = True
    73. End Sub


    Fehler abfangen und son Zeugs muss halt noch ergänzt werden.

    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „peterfido“ ()

    Hi,

    ich danke dir schonmal. Der Aufbau wird immer gleich sein, es werden grob gerechnet 50-60000 Daten. Mit deiner Lösung ist mir bereits sehr geholfen, ich versuche das mal einzugeben.

    Nachtrag:
    Ich glaube es hapert da schon an der Umsetzung. Ich sehe die Textdatei in der Entwicklungsumgebung in Excel, nicht gewünschte Zeilen erscheinen rot. Wie schaffe ich die Form wie du sie raus hast in das Arbeitsblatt von Excel zu bekommen?
    Die Nachkommastellen bei der Zeit sind sehr wichtig, die werden benötigt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „juliasjulian“ ()

    Bin nicht mehr am PC. Nur noch am Lappi im Wohnzimmer ;)

    Wenn die Daten als Textdatei vorliegen, dann kannst Du diese komplett einlesen oder Zeilenweise durchackern und dabei gleich das Array erstellen. Statt des Arrays würde es auch gleich in die Excel-Tabelle gehen. Meine Konstante Daten dient nur dem Test. Diese kann durch eine Variable ersetzte werden, welche den Inhalt der Textdatei enthält. Dazu z.B. mit dem FileSystemObject die Textdatei mit readall einlesen.

    Ich persönlich würde evtl. auch einfach ein VBS-Script daraus machen, welches die Daten in eine csv-Datei für Excel umpackt.

    Wenn die Kommastellen hinter der Zeit wichtig sind, dann klappt die Umrechnung mit den Hausfunktionen für Datum/Zeit nicht. Da müsste man halt noch mehr Details haben und dann Gedanken machen.

    Jetzt ist aber erstmal gemütlicher Fernsehabend angesagt :)
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    sooo.
    Ich habe den Weg eingeschlagen, die Textdatei mit Semikolons zu erzeugen. Somit kann ich die Daten getrennt in Excel einlesen und Filtern. Die Daten entstehen aus einem Versuch, in dem die Genauigkeiten von Zeigegesten einer 3D Kamera ermittelt werden. Etwa 5 Personen werden aus 2 Positionen auf 7 Zeigeziele zeigen. Daraus möchte ich Diagramme erzeugen, die die Winkelgenauigkeit und die Fehldistanz zwischen Ziel und ermitteltem Zeigepunkt darstellen. Da ich das einmal in Abhängigkeit von Positionen und einmal in Abhängigkeit von Personen darstellen will, benötige ich 5*7=35 (Personen und Positionen)Tabellen um die Diagramme zu erzeugen, oder kennt da jemand einen einfacheren Weg? :)

    Nachtrag:
    Der Filter ist nicht besonders gut, da viele eingegrenzte Bereiche ähnlich wiederholt werden und das nicht mehr zugeordnet werden kann wohin welche Werte wirklich gehören...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „juliasjulian“ ()

    Da gibt es bestimmt einige Möglichkeiten. Was zusammen dargestellt werden soll, kommt in eine Tabelle. Daraus dann das Diagramm erstellen. Bei Diagrammen nehme ich auch für Zeitangaben lieber die Formatierung Text. Sonst quetscht Excel das immer so blöd. Sollte auch für deine Zeiten mit den Nachkommastellen gut gehen.

    Die csv-Datei erstellst Du direkt oder durch 'umpacken', wie ich es oben angedeutet habe? Evtl. ist Dein Code dafür dann für andere eine Hilfe.
    Gruß
    Peterfido

    Keine Unterstützung per PN!