Daten sortieren

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Daten sortieren

    Hallo zusammen,

    wie kann ich folgende Daten sortieren bzw. prüfen ob sie zusammen passen? Es sind mehrere Platten mit Bohrungen, deren Koordinaten zueinander passen sollen.

    Platte 1
    Bohrung1 X=10 Y=20
    Bohrung2 X=10 Y=30
    Bohrung3 X=10 Y=40

    Platte 2
    Bohrung1 X=10 Y=21
    Bohrung2 X=10 Y=40
    Bohrung3 X=10 Y=30,1


    Wie kann ich die Abweichung berechnen? Die Bohrungen sind nicht in der Reihenfolge. Wäre dann ähnlich diesem Programm: i-logic.com/TruePos/

    Vielen Dank

    Goof
    Genau so wie im Anhang? Oder hat die noch ieine Formatierung zB csv oder xml etc???

    Wäre nicht schlecht wenn du ein bissl detaillierte Informationen gibts.
    Gibt es immer Platte 1 und 2 ?
    Oder mehr?
    Woher weiß man welche Platte "passen" muss falls es mehr als 2 gibt?
    Dateien
    • bohrung.txt

      (142 Byte, 93 mal heruntergeladen, zuletzt: )
    Das ist meine Signatur und sie wird wunderbar sein!
    @Goof Lies die Datei ein wie auch immer, mach Dir pro Loch und Platte ein PoinF mit den Koordinaten, pack die in eine Dictionary(Of String, PointF).
    Hol dann aus beiden Dictionarys die Koordinaten mit demselben Namen, berechne was zu berechnen ist und feddich. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Goof Es genügt doch, wenn die Reihenfolge gleich ist.
    Poste mal so eine Datei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das wird kompliziert!
    Du musst mit RegEx die Textdatei analysieren, die jeweiligen Bohrungen finden und die dazugehörigen X bzw. Y Koordinaten!
    Diese musst due dann in ein Array, Liste etc. speichern..
    ..dann kannst Du in einer(oder mehreren) Schleife die dazugehörigen Bohrungen suchen!

    Du durchläufst also jede Bohrung, nimmst dir den ersten X Wert..z.B. X=10 und suchst dir dann alle Bohrungen mit X=10 raus..wenn diese dann noch den gleichen Y-Wert haben sind die Bohrungen identisch..
    ..zeitgleich müsste man die Differenz ausgeben lassen..z.B. wenn eine Bohrung den Y-Wert 20 hat und die andere 20,5 die Differenz 0,5..
    ..das wird ne schöne fummelarbeit werden..

    Ich hab Dir hier mal ein kleines Beispiel erstellt wie man z.B. die einzelnen Bohrungen auslesen könnte:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Text.RegularExpressions
    3. Public Class Form1
    4. Dim _Platte1 As String = "Bohrung1 X=10 Y=20 Bohrung2 X=10 Y=30 Bohrung3 X=10 Y=40"
    5. Dim _Platte2 As String = "Bohrung1 X=10,1 Y=21,5 Bohrung2 X=10 Y=40 Bohrung3 X=10 Y=30,1"
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Dim re1 As String = "(Bohrung)"
    8. Dim re2 As String = "(\d+)" 'Integer Number
    9. Dim re3 As String = ".*?" 'Non-greedy match on filler
    10. Dim re4 As String = "(X)" 'Single Word Character
    11. Dim re5 As String = "(=)" 'Single Character
    12. Dim re6 As String = "(Y)" 'Single Word Character
    13. Dim re7 As String = "(,)" 'Single Character
    14. Dim r As Regex = New Regex(re1 + re2 + re3 + re4 + re5 + re2 + re3 + re6 + re5 + re2, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
    15. Dim m As Match = r.Match(_Platte2)
    16. If (m.Success) Then
    17. Dim wBohrung = m.Groups(1)
    18. Dim iBohrungNr = m.Groups(2)
    19. Dim _X = m.Groups(3)
    20. Dim _X_equals = m.Groups(4)
    21. Dim _X_Number = m.Groups(5)
    22. Dim _Y = m.Groups(6)
    23. Dim _Y_equals = m.Groups(7)
    24. Dim _Y_Number = m.Groups(8)
    25. 'Console.WriteLine("(" + wBohrung.ToString() + ")" + "(" + iBohrungNr.ToString() + ")" + "(" + _X.ToString() + ")" + "(" + _X_equals.ToString() + ")" + "(" + _X_Number.ToString() + ")" + "(" + _Y.ToString() + ")" + "(" + _Y_equals.ToString() + ")" + "(" + _Y_Number.ToString() + ")" + "")
    26. Debug.WriteLine(wBohrung.ToString() & " " & iBohrungNr.ToString() & Environment.NewLine &
    27. _X.ToString() & "=" & _X_Number.ToString() & Environment.NewLine &
    28. _Y.ToString() & "=" & _Y_Number.ToString())
    29. End If
    30. End Sub
    31. End Class


    Ich bin nicht so der RegEx Experte, jemand der sich damit auskennt kann Dir bestimmt was leichteres bzw. übersichtlicheres und auch kompakteres zusammenstellen..ich hab dieses RegEx mit txt2re.com/ zusammengeschustert!


    Morrison schrieb:

    RegEx
    Würdest Du einfach mal abwarten, bis wir wissen, wie die Datei aufgebaut ist :?:
    Der Text da oben geht einfach mit Split().
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja ich würde kein RegEx verwenden.
    Aktuell sieht so aus als könnte man mit CrLf splitten und dann mit Space splitten, wobei das erste Element des 2. gesplitteten Arrays die Bohrnummer enthält und die weiteren die Koordinaten (alles was dem "=" folgt ist dann der Wert, davor die Koordinate).
    Das Ganze könnte man im Zweifel in ein eigenes Objekt vom Typ Platte(mit einer List of Bohrung/Point) einlesen und dann entsprechend vergleichen.
    Das ist meine Signatur und sie wird wunderbar sein!
    RegEx finde ich eine gute Idee und dann irgendwie so weiter

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Drawing
    4. Imports System.Drawing.Drawing2D
    5. Public Module Module1
    6. Public Sub Main()
    7. Dim Bohrung1 As New List(Of PointF) From {New PointF(10, 20), New PointF(10, 30), New PointF(10, 40)}
    8. Dim Bohrung2 As New List(Of PointF) From {New PointF(10, 21), New PointF(10, 40), New PointF(10, 30.1)}
    9. Dim b1 As List(Of PointF) = Bohrung1.OrderBy(Function(pf) pf.X).ThenBy(Function(pf) pf.Y).ToList
    10. Dim b2 As List(Of PointF) = Bohrung2.OrderBy(Function(pf) pf.X).ThenBy(Function(pf) pf.Y).ToList
    11. Dim Varianc As List(Of PointF) = Variance(b1, b2)
    12. Stop
    13. End Sub
    14. Private Function Variance(ByVal b1 As List(Of PointF), ByVal b2 As List(Of PointF)) As List(Of PointF)
    15. Dim poif As PointF
    16. Dim res As New List(Of PointF)(b1.Count)
    17. For i As Integer = 0 To b1.Count - 1
    18. poif = New PointF(b1(i).X - b2(i).X, b1(i).Y - b2(i).Y)
    19. res.Add(poif)
    20. Next
    21. Return res
    22. End Function
    23. End Module



    Freundliche Grüsse

    exc-jdbi