Problem mit Liste und Schleife VB.NET



  • Hallo!

    Ich erstelle gerade ein Programm, und hab ein Problem mit einer Schleife, wo ich selbst nicht auf die Lösung komme, und mir das Programm auch keinen Fehler anzeigt.

    Also ich lese eine Datei ein, welche gesplittet wird, und dann jede Zeile als Item einer Liste hinzugefügt wird.
    Die einzulesende Datei sieht so aus (ist eine Plotterdatei mit der Endung *.plt)

    IN;
    SP1;
    PU940,5104;
    PD856,5104,772,5100,688,5092,608,5084,524,5072,444,5056,360,5040,280,5020,200,5000,124,4976,44,4952,-32,4924,-108,4892,-184,4860,-260,4824,-336,4788,-408,4748,-480,4708,-552,4664,-620,4620,-692,4572,-760,4520,-828,4468,-892,4416,-956,4360,-1020,4304,-1084,4244,-1144,4184,-1204,4124,-1264,4060,-1320,3992,-1380,3924,-1432,3856,-1488,3788,-1540,3716,-1592,3640,-1640,3564,-1688,3488,-1736,3412,-1780,3332,-1824,3252,-1864,3168,-1904,3084,-1944,3000,-1980,2916,-2016,2828,-2052,2740,-2084,2648,-2112,2560,-2144,2468,-2168,2376,-2192,2280,-2216,2188,-2240,2092,-2256,1996,-2276,1896,-2292,1800,-2304,1700,-2316,1600,-2324,1500,-2332,1396,-2336,1296,-2340,1192,-2340,1088,-2340,988,-2336,884,-2332,780,-2324,680,-2316,580,-2304,480,-2292,380,-2276,284,-2256,184,-2240,88,-2216,-8,-2192,-100,-2168,-196,-2144,-288,-2112,-380,-2084,-472,-2052,-560,-2016,-648,-1980,-736,-1944,-820,-1904,-904,-1864,-988,-1824,-1072,-1780,-1152,-1736,-1232,-1688,-1308,-1640,-1388,-1592,-1460,-1540,-1536,-1488,-1608,-1432,-1676,-1380,-1748,-1320,-1816,-1264,-1880,-1204,-1944,-1144,-2008,-1084,-2068,-1020,-2124,-956,-2184,-892,-2236,-828,-2292,-760,-2344,-692,-2392,-620,-2440,-552,-2484,-480,-2528,-408,-2568,-336,-2608,-260,-2644,-184,-2680,-108,-2712,-32,-2744,44,-2772,124,-2796,200,-2820,280,-2844,360,-2860,444,-2880,524,-2892,608,-2904,688,-2912,772,-2920,856,-2924,940,-2924,1028,-2924,1112,-2920,1192,-2912,1276,-2904,1360,-2892,1440,-2880,1520,-2860,1600,-2844,1680,-2820,1760,-2796,1840,-2772,1916,-2744,1992,-2712,2068,-2680,2144,-2644,2216,-2608,2292,-2568,2364,-2528,2436,-2484,2504,-2440,2572,-2392,2640,-2344,2708,-2292,2776,-2236,2840,-2184,2904,-2124,2968,-2068,3028,-2008,3088,-1944,3148,-1880,3204,-1816,3260,-1748,3316,-1676,3372,-1608,3424,-1536,3472,-1460,3524,-1388,3572,-1308,3616,-1232,3664,-1152,3748,-988,3828,-820,3864,-736,3900,-648,3936,-560,3968,-472,3996,-380,4024,-288,4052,-196,4076,-100,4100,-8,4120,88,4140,184,4156,284,4172,380,4188,480,4200,580,4208,680,4216,780,4220,884,4224,988,4224,1088,4224,1192,4220,1296,4216,1396,4208,1500,4200,1600,4188,1700,4172,1800,4156,1896,4140,1996,4120,2092,4100,2188,4076,2280,4052,2376,4024,2468,3996,2560,3968,2648,3900,2828,3828,3000,3748,3168,3664,3332,3616,3412,3572,3488,3524,3564,3472,3640,3424,3716,3372,3788,3316,3856,3260,3924,3204,3992,3148,4060,3088,4124,3028,4184,2968,4244,2904,4304,2840,4360,2776,4416,2708,4468,2640,4520,2572,4572,2504,4620,2436,4664,2364,4708,2292,4748,2216,4788,2144,4824,2068,4860,1992,4892,1916,4924,1840,4952,1760,4976,1680,5000,1600,5020,1520,5040,1440,5056,1360,5072,1276,5084,1192,5092,1112,5100,1028,5104,940,5104;
    PU;
    SP1;
    

    Die Schleife sieht folgendermaßen aus:

    For Each Line In dataset
                If Not String.IsNullOrEmpty(Line) Then 'Leere Zeilen (z.B. am Ende) ignorieren.
                    Dim LastChar = Line(Line.Length - 1)
                    If Not LastChar = ";"c Then
                        'Jede Zeile endet mit einem Semikolon. Ist das nicht der Fall, ist wahrscheinlich die Datei beschädigt.
                    End If
                    Dim Action = Line.Substring(0, 2)
                    Dim HasArgument = (Line.Length - 2 - 1 <> 0) 'Gesamte Länge minus 2 Zeichen am Anfang minus Semikolon am Ende.
                    Dim Argument = If(HasArgument, Line.Substring(2, Line.Length - 1 - 1), Nothing)
                    Select Case Action
                        Case "PU" 'Stift oben
                            '...
                            If HasArgument Then
                                Dim Parts = Argument.Split(","c)
                                If Parts.Length Mod 2 <> 0 Then
                                    'Wenn immer Paare von X- und Y-Werten vorkommen sollen, muss die Anzahl gerade sein.
                                End If
                                For Each i In Parts
                                    Dim CoordinatePart As Integer
                                    If Not Integer.TryParse(i, CoordinatePart) Then
                                        'Datei beschädigt
                                    End If
                                    FastColoredTextBox1.InsertText(CoordinatePart & ",", An)
                                Next
                            End If
                        Case "PD" 'Stift unten
                            '...
                            If HasArgument Then
                                Dim Parts = Argument.Split(","c)
                                If Parts.Length Mod 2 <> 0 Then
                                    'Wenn immer Paare von X- und Y-Werten vorkommen sollen, muss die Anzahl gerade sein.
                                End If
                                For Each i In Parts
                                    Dim CoordinatePart As Integer
                                    If Not Integer.TryParse(i, CoordinatePart) Then
                                        'Datei beschädigt
                                    End If
                                    '...
                                Next
                            End If
                    End Select
                End If
            Next
    

    Das Problem dabei ist nun, das die Variable "Action" immer nur beim ersten Schleifendurchlauf beschrieben wird, und ab dem zweiten leer bleibt, somit kommt man nie in das Select Case.

    Dann hätte ich noch eine Frage, welche auch damit zu tun hat.
    Wenn ich in der Datei die ersten beiden Zeilen weg mache, funktioniert es auch (wenn auch nur ein mal), und das Programm springt in das Case "PU". Dort wird dann auch die Zeile gelesen, und beide Zahlen nacheinander gelesen.
    Wie bekomme ich nun die beiden Zahlen in zwei unterschiedliche Variablen? Also die erste ausgelesene Zahl soll in temp1 und die zweite in temp2.

    Würde mich über Hilfe sehr freuen.



  • Hast du verifiziert, dass die Liste korrekt im Dataset landet? Wie liest du sie dort ein? Wegen deiner zweiten Frage kannst du String.Split benutzen. Also im Sinn von:

    Dim temp = "940,5104".Split(","c)
    ' temp[0] iat dann "940", temp[1] "5104"
    


  • Hab es nun hinbekommen mit dem richtigen einlesen, war das falsche Split-Argument. 🙂

    Jetzt hänge ich beim letzten Teil, und drehe mich die ganze Zeit nur im Kreis.
    Also ich hab nun die Zeile, welche z.B. so aussieht: 856,5104,772,5100,688,5092,608,5084,524,5072,444,5056
    Diese wird nun immer paarweise eingelesen, und zwei verschiedenen Variablen zugewiesen. Also in dem Fall hat dann temp1 den Wert 856, und temp2 den Wert 5104. Dies funktioniert auch, allerdings ist die Schleife ja noch nicht fertig, und das nächste Paar wird eingelesen (geht auch, sehe es im Debugger). Allerdings bekommen nun temp1 und temp2 nicht mehr die neuen Werte.
    Wie sähe denn der Code richtig aus?

    For Each i In Parts
    Dim CoordinatePart As Integer
    If Not Integer.TryParse(i, CoordinatePart) Then
    'Datei beschädigt
    End If
    '...
    tempX =Parts(0)
    tempY =Parts(1)
    Next
    

    Oder wie kann man das sonst machen?



  • Hab es hinbekommen, hat sich also erledigt.


Anmelden zum Antworten