Python zu VB.NET

  • Python

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Parmaster.

    Python zu VB.NET

    Hallo!

    Ich habe ein Python Skript, und würde das gern umschreiben zu VB.NET. Da ich allerdings in Python noch schlechter bin als in VB, könnte ich etwas Hilfe gebrauchen, da ich bei manchen Sachen nicht weiterkomme.

    Also speziell geht es mir jetzt um dieses Stückchen Code:

    Python-Quellcode

    1. ​for data in dataset:
    2. arr = data.split(" ")
    3. if arr[0] <> "SP1;" and arr[0] <> "SP0;":
    4. lsrx = arr[0]
    5. lsr = lsrx[0]+lsrx[1]
    6. if len(lsrx) == 3:
    7. x = int(lsrx[2])
    8. elif len(lsrx) == 4:
    9. x = int(lsrx[2]+lsrx[3])
    10. elif len(lsrx) == 5:
    11. x = int(lsrx[2]+lsrx[3]+lsrx[4])
    12. elif len(lsrx) == 6:
    13. x = int(lsrx[2]+lsrx[3]+lsrx[4]+lsrx[5])
    14. elif len(lsrx) == 7:
    15. x = int(lsrx[2]+lsrx[3]+lsrx[4]+lsrx[5]+lsrx[6])
    16. lsry = arr[1]
    17. if len(lsry) == 2:
    18. y = int(lsry[0])
    19. elif len(lsry) == 3:
    20. y = int(lsry[0]+lsry[1])
    21. elif len(lsry) == 4:
    22. y = int(lsry[0]+lsry[1]+lsry[2])
    23. elif len(lsry) == 5:
    24. y = int(lsry[0]+lsry[1]+lsry[2]+lsry[3])
    25. elif len(lsry) == 6:
    26. y = int(lsry[0]+lsry[1]+lsry[2]+lsry[3]+lsry[4])


    Wenn ich das richtig sehe ist arr ein Array, und dem wird der Inhalt von data übergeben. Ich frag mich nur wir groß das Array ist. Oder einfach nur "Dim arr() As New Double"?
    Dann wird der 1. Index, also arr[0] der Variable lsrx übergeben, wobei lsrx auch ein Array ist?
    Zu dem gibt es noch die Python Funktion len. Was ist das äquivalent dazu in VB.NET
    Und, auch wenn es hier nicht mehr dabei steht, taucht irgendwann später noch die Python Funktion abs auf. Was wäre dazu das äquivalent?

    Wäre sehr nett wenn mich jemand aufklären könnte. :thumbup:


    PS: war mir nicht sicher ob es hier richtig ist, wenn nicht, bitte verschieben.
    Ich hab mal versucht, den Sinn des Codes zu erfassen.

    VB.NET-Quellcode

    1. For Each data In dataset
    2. Dim arr = data.Split(" "c) 'Angenommen an allen Leerzeichen soll aufgeteilt werden.
    3. If arr(0) <> "SP1;" AndAlso arr(0) <> "SP0;" Then
    4. Dim lsrx = arr(0)
    5. Dim lsr = lsrx(0) & lsrx(1) 'Angenommen arr(0) ist ein String.
    6. Dim x = Integer.Parse(lsrx.Substring(2)) 'Angenommen lsrx kann nicht länger als 7 sein.
    7. Dim x = Integer.Parse(lsrx.Substring(2, Math.Min(lsrx.Length, 5))) 'Ansonsten so.
    8. Dim lsry = arr(1)
    9. Dim y = Integer.Parse(lsry.Substring(0, lsry.Length - 1))
    10. End If
    11. Next

    Strings können ähnlich wie Char-Arrays verwendet werden. Ist wie in VB:

    VB.NET-Quellcode

    1. Dim A = "Hallo Welt"
    2. Dim B = A(3) & A(4) 'Stringverknüpfung mit &
    3. 'B beinhaltet "lo"
    Wäre das Äquivalent zu

    Python-Quellcode

    1. A = "Hallo Welt"
    2. B = A[3] + A[4] #Stringverknüpfung mit +


    abs gibt den Absolutwert zurück. Das Äquivalent wäre Math.Abs in .Net.

    Übrigens:
    Array in VB:

    VB.NET-Quellcode

    1. Dim A As Integer() 'Integer-Array ist noch nicht zugewiesen (Nothing).
    2. Dim A As Integer() = New Integer() {1, 2, 3} 'Wie darüber, aber es wird ein Integer-Array zugewiesen (nicht mehr Nothing).
    3. Dim A As Integer() = {1, 2, 3} 'Kurzform von "New Integer() {1, 2, 3}"
    4. Dim A = New Integer() {1, 2, 3} 'Typ von A wird automatisch erkannt (Integer-Array bzw. Integer()).
    5. Dim A = New Byte() {1, 2, 3} 'Welchen Typ A bekommen soll (Nämlich Byte-Array bzw. Byte()) wird automatisch erkannt ("Option Infer").
    6. Dim A As Byte() = {1, 2, 3} 'Der Compiler erkennt, dass die Elemente Bytes sein müssen und verwendet deshalb korrekterweise ein Byte-Array.
    7. Dim A = {1, 2, 3} 'Der Compiler nimmt an, dass die Elemente vom Typ Integer sind und erstellt ein Integer-Array.

    Das sind so die Deklarationsmöglichkeiten, die mir für Arrays einfallen.
    Es gibt auch manchmal die Möglichkeit, die Array-Klammer beim Variablennamen zu schreiben, aber das sollte man nie verwenden. Sie auch hier.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Vielen Dank für deine Antwort.

    Ich hätte dazu schreiben sollen das es keine Strings sind, sondern irgendwelche Koordinaten, also eigentlich Double.

    Das ganze soll dazu dienen, eine PLT (Plotterdatei) auszulesen.

    So ungefähr sieht der Inhalt einer PLT Datei aus:

    Quellcode

    1. ​PU-6140,5048;
    2. PD-6188,5048,-6188,5096,-6140,5096,-6140,5048;
    3. PU-6140,4808;
    4. PD-6188,4808,-6188,5020,-6140,5020,-6140,4808;
    5. PU-6076,5020;


    Kommen danach noch ein paar Berechnungen, deshalb die Frage nach Math.Abs. Warum der eigentliche Urheber dafür den Absolutwert braucht kann ich nicht sagen, da es eine einfache Rechnung ist, also sowas 1069-763.
    PLT Datei
    Also doch Strings ;)
    Da deutet auch einiges darauf hin:
    arr = data.split(" ") Was zu splitten macht nur bei Strings Sinn.
    arr[0] <> "SP1;" and arr[0] <> "SP0;" Da wird mit Strings verglichen.
    int(lsrx[2]+lsrx[3]) int() parst einen String zu einem Integer (Das, was in .Net Integer.Parse macht).

    Davon abgesehen: Wenn Du den Inhalt der Datei in Deinem .Net-Programm verarbeiten willst, solltest Du nicht den übersetzten Python-Code zum Parsen verwenden, sondern den Teil selbst schreiben. Der Python-Code sieht nämlich krass Spaghettimäßig aus.
    Das selbst schreiben dürfte auch kein allzu großes Problem sein. Zur Not geht es auch mit einem RegEx-Pattern.
    Könntest Du eventuell einen größeren Ausschnitt der Datei posten? Dann erkennt man besser, was man alles beachten muss.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Der Python-Code sieht nämlich krass Spaghettimäßig aus.


    Du hast den Rest noch nicht gesehen. ;)

    Stimmt, das SP1 und SP0 bzw. PD und PU sind Strings, aber der Rest sind ja Integer Werte.

    Eigentlich wollte ich so eine Datei anhängen, geht aber nicht, deshalb hier der Code (Achtung, ewig lang):

    Spoiler anzeigen
    IN;
    PU;
    SP3;
    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;
    SP2;
    PU940,3928;
    PD1024,3928,1104,3920,1184,3912,1264,3896,1340,3880,1416,3860,1488,3836,1560,3808,1632,3776,1700,3740,1768,3704,1832,3664,1896,3620,1956,3572,2012,3524,2068,3472,2120,3420,2172,3360,2216,3304,2264,3240,2304,3180,2344,3112,2376,3048,2408,2976,2440,2908,2464,2836,2484,2760,2504,2684,2516,2608,2528,2532,2532,2452,2536,2372,2532,2292,2528,2212,2516,2136,2504,2060,2484,1984,2464,1908,2440,1836,2408,1768,2376,1696,2344,1632,2304,1564,2264,1500,2216,1440,2172,1380,2120,1324,2068,1272,2012,1220,1956,1172,1896,1124,1832,1080,1768,1040,1700,1004,1632,968,1560,936,1488,908,1416,884,1340,864,1264,844,1184,832,1104,820,1024,816,940,812,860,816,780,820,700,832,620,844,544,864,468,884,396,908,324,936,252,968,184,1004,116,1040,52,1080,-12,1124,-72,1172,-128,1220,-184,1272,-236,1324,-288,1380,-336,1440,-380,1500,-420,1564,-460,1632,-496,1696,-528,1768,-556,1836,-580,1908,-600,1984,-620,2060,-632,2136,-644,2212,-652,2292,-652,2372,-652,2452,-644,2532,-632,2608,-620,2684,-600,2760,-580,2836,-556,2908,-528,2976,-496,3048,-460,3112,-420,3180,-380,3240,-336,3304,-288,3360,-236,3420,-184,3472,-128,3524,-72,3572,-12,3620,52,3664,116,3704,184,3740,252,3776,324,3808,396,3836,468,3860,544,3880,620,3896,700,3912,780,3920,860,3928,940,3928;
    PU;
    SP1;
    PU-6784,5164;
    PD-6864,4876,-6916,4876,-6972,5084,-7024,4876,-7080,4876,-7156,5164,-7100,5164,-7044,4956,-6996,5164,-6944,5164,-6884,4956,-6828,5164,-6784,5164;
    PU-6704,5116;
    PD-6752,5116,-6752,5164,-6704,5164,-6704,5116;
    PU-6704,4876;
    PD-6752,4876,-6752,5088,-6704,5088,-6704,4876;
    PU-6468,4876;
    PD-6516,4876,-6516,5008,-6520,5024,-6524,5036,-6536,5044,-6548,5048,-6568,5044,-6580,5032,-6592,5012,-6596,4984,-6596,4876,-6644,4876,-6644,5088,-6600,5088,-6600,5040,-6588,5060,-6572,5080,-6556,5088,-6536,5092,-6508,5088,-6488,5076,-6472,5048,-6468,5012,-6468,4876;
    PU-6232,4876;
    PD-6408,4876,-6408,5164,-6356,5164,-6356,4920,-6232,4920,-6232,4876;
    PU-6140,4876;
    PD-6192,4876,-6192,5164,-6140,5164,-6140,4876;
    PU-5860,4876;
    PD-5912,4876,-6020,5060,-6028,5072,-6032,5084,-6032,4876,-6076,4876,-6076,5164,-6016,5164,-5920,4992,-5916,4984,-5904,4968,-5904,5164,-5860,5164,-5860,4876;
    PU-5620,4876;
    PD-5804,4876,-5804,5164,-5620,5164,-5620,5120,-5752,5120,-5752,5044,-5648,5044,-5648,5000,-5752,5000,-5752,4920,-5620,4920,-5620,4876;
    PU-6900,4036;
    PD-6904,4032,-6912,4036,-7096,4420,-7096,4424,-7092,4424,-7088,4420,-6904,4044,-6852,4156,-6980,4420,-6980,4424,-6976,4424,-6972,4420,-6848,4164,-6720,4420,-6716,4424,-6712,4424,-6712,4420,-6844,4156,-6788,4044,-6604,4420,-6600,4424,-6596,4424,-6596,4420,-6784,4036,-6788,4032,-6792,4032,-6796,4036,-6848,4148,-6900,4036;
    PU-6584,4304;
    PD-6580,4300,-6576,4292,-6580,4288,-6584,4284,-6592,4288,-6596,4292,-6592,4300,-6584,4304;
    PU-6584,4088;
    PD-6584,4084,-6588,4084,-6592,4084,-6592,4088,-6592,4208,-6592,4212,-6588,4212,-6584,4212,-6584,4208,-6584,4088;
    PU-6508,4088;
    PD-6508,4084,-6512,4084,-6516,4084,-6516,4088,-6516,4208,-6516,4212,-6512,4212,-6508,4212,-6508,4208,-6508,4180,-6492,4196,-6476,4204,-6448,4212,-6428,4208,-6416,4200,-6412,4184,-6408,4164,-6408,4088,-6408,4084,-6412,4084,-6416,4084,-6416,4088,-6416,4164,-6416,4180,-6424,4196,-6432,4200,-6448,4204,-6460,4200,-6476,4196,-6492,4184,-6508,4168,-6508,4088;
    PU-6328,4044;
    PD-6076,4044,-6072,4044,-6072,4040,-6072,4036,-6076,4036,-6328,4036,-6336,4036,-6336,4044,-6336,4420,-6336,4424,-6332,4424,-6328,4424,-6328,4420,-6328,4044;
    PU-6004,4420;
    PD-6004,4424,-6000,4424,-5996,4424,-5996,4420,-5996,4036,-5996,4032,-6000,4032,-6004,4032,-6004,4036,-6004,4420;
    PU-5892,4408;
    PD-5892,4036,-5892,4032,-5896,4032,-5900,4032,-5900,4036,-5900,4420,-5900,4424,-5896,4424,-5892,4424,-5892,4420,-5596,4048,-5596,4420,-5596,4424,-5592,4424,-5588,4424,-5588,4420,-5588,4036,-5588,4032,-5592,4032,-5596,4036,-5892,4408;
    PU-5496,4152;
    PD-5536,4152,-5540,4152,-5540,4156,-5540,4160,-5536,4160,-5496,4160,-5496,4420,-5492,4424,-5488,4424,-5236,4424,-5232,4424,-5232,4420,-5232,4416,-5236,4416,-5488,4416,-5488,4160,-5228,4160,-5224,4160,-5224,4156,-5224,4152,-5228,4152,-5488,4152,-5488,4044,-5236,4044,-5232,4044,-5232,4040,-5232,4036,-5236,4036,-5488,4036,-5496,4036,-5496,4044,-5496,4152;
    PU-6496,3168;
    PD-6604,3168,-6700,3428,-6724,3428,-6724,3508,-6548,3508,-6548,3428,-6572,3428,-6532,3280,-6484,3428,-6508,3428,-6508,3508,-6360,3508,-6360,3428,-6384,3428,-6332,3280,-6292,3428,-6316,3428,-6316,3508,-6180,3508,-6180,3428,-6204,3428,-6300,3168,-6404,3168,-6452,3296,-6496,3168;
    PU-6000,3168;
    PD-6168,3168,-6168,3240,-6144,3240,-6144,3328,-6168,3328,-6168,3404,-6020,3404,-6020,3240,-6000,3240,-6000,3168;
    PU-6156,3472;
    PD-6148,3488,-6136,3504,-6112,3512,-6084,3516,-6060,3512,-6036,3504,-6024,3488,-6020,3472,-6024,3452,-6040,3440,-6060,3432,-6088,3428,-6112,3432,-6136,3440,-6148,3452,-6156,3472;
    PU-5776,3168;
    PD-5964,3168,-5964,3240,-5932,3240,-5932,3328,-5964,3328,-5964,3404,-5808,3404,-5808,3376,-5760,3400,-5712,3408,-5672,3400,-5644,3384,-5624,3348,-5620,3304,-5620,3240,-5592,3240,-5592,3168,-5744,3168,-5744,3272,-5744,3300,-5748,3316,-5760,3324,-5772,3328,-5792,3324,-5808,3316,-5808,3240,-5776,3240,-5776,3168;
    PU-5232,3168;
    PD-5556,3168,-5556,3248,-5524,3248,-5524,3428,-5556,3428,-5556,3508,-5360,3508,-5360,3428,-5392,3428,-5392,3248,-5312,3248,-5312,3304,-5232,3304,-5232,3168;
    PU-5016,3168;
    PD-5208,3168,-5208,3248,-5176,3248,-5176,3428,-5208,3428,-5208,3508,-5016,3508,-5016,3428,-5048,3428,-5048,3248,-5016,3248,-5016,3168;
    PU-4840,3168;
    PD-4980,3168,-4980,3248,-4952,3248,-4952,3428,-4980,3428,-4980,3508,-4820,3508,-4692,3332,-4692,3428,-4720,3428,-4720,3508,-4584,3508,-4584,3428,-4612,3428,-4612,3164,-4728,3164,-4868,3368,-4868,3248,-4840,3248,-4840,3168;
    PU-4224,3168;
    PD-4548,3168,-4548,3248,-4520,3248,-4520,3428,-4548,3428,-4548,3508,-4224,3508,-4224,3400,-4312,3400,-4312,3428,-4388,3428,-4388,3372,-4324,3372,-4324,3304,-4388,3304,-4388,3248,-4312,3248,-4312,3276,-4224,3276,-4224,3168;
    PU940,4360;
    PD1048,4356,1152,4348,1256,4332,1360,4312,1460,4284,1556,4248,1652,4212,1748,4168,1840,4116,1928,4064,2016,4004,2100,3940,2180,3868,2260,3796,2336,3720,2408,3636,2476,3552,2540,3460,2600,3368,2660,3272,2712,3172,2764,3068,2808,2960,2852,2852,2888,2740,2920,2624,2948,2508,2972,2388,2992,2268,3004,2144,3012,2020,3016,1892,3012,1764,3004,1640,2992,1516,2972,1396,2948,1276,2920,1160,2888,1044,2852,932,2808,824,2764,716,2712,616,2660,512,2600,416,2540,324,2476,236,2408,148,2336,68,2260,-12,2180,-84,2100,-152,2016,-216,1928,-276,1840,-332,1748,-380,1652,-424,1556,-464,1460,-500,1360,-524,1256,-548,1152,-564,1048,-572,940,-576,836,-572,732,-564,628,-548,524,-524,424,-500,328,-464,228,-424,136,-380,44,-332,-44,-276,-132,-216,-216,-152,-296,-84,-376,-12,-452,68,-524,148,-592,236,-656,324,-720,416,-776,512,-832,616,-880,716,-928,824,-968,932,-1004,1044,-1040,1160,-1068,1276,-1088,1396,-1108,1516,-1120,1640,-1128,1764,-1132,1892,-1128,2020,-1120,2144,-1108,2268,-1088,2388,-1068,2508,-1040,2624,-1004,2740,-968,2852,-928,2960,-880,3068,-832,3172,-776,3272,-720,3368,-656,3460,-592,3552,-524,3636,-452,3720,-376,3796,-296,3868,-216,3940,-132,4004,-44,4064,44,4116,136,4168,228,4212,328,4248,424,4284,524,4312,628,4332,732,4348,836,4356,940,4360;
    PU-6868,1772;
    PD-6436,1772,-6436,-2256,-6868,-2256,-6868,1772;
    PU-6156,1772;
    PD-5724,1772,-5724,-2256,-6156,-2256,-6156,1772;
    PU-5108,1620;
    PD-4516,1764,-3156,-3748,-3748,-3892,-5108,1620;
    PU2188,-3740;
    PD6336,-3740,6420,-3744,6500,-3756,6576,-3772,6652,-3796,6724,-3828,6792,-3860,6852,-3904,6912,-3948,6964,-4000,7012,-4052,7052,-4112,7088,-4172,7112,-4236,7132,-4304,7140,-4340,7148,-4376,7148,-4412,7152,-4448,7148,-4484,7148,-4520,7140,-4556,7132,-4588,7112,-4656,7088,-4720,7052,-4784,7012,-4844,6964,-4896,6912,-4948,6852,-4992,6792,-5032,6724,-5068,6652,-5100,6576,-5124,6500,-5140,6420,-5152,6336,-5156,2188,-5156,2104,-5152,2024,-5140,1948,-5124,1872,-5100,1800,-5068,1732,-5032,1672,-4992,1612,-4948,1560,-4896,1512,-4844,1472,-4784,1436,-4720,1408,-4656,1388,-4588,1384,-4556,1376,-4520,1372,-4484,1372,-4448,1372,-4412,1376,-4376,1384,-4340,1388,-4304,1408,-4236,1436,-4172,1472,-4112,1512,-4052,1560,-4000,1612,-3948,1672,-3904,1732,-3860,1800,-3828,1872,-3796,1948,-3772,2024,-3756,2104,-3744,2188,-3740;
    PU1856,-4812;
    PD1628,-4184,1732,-4184,1904,-4684,2088,-4184,2152,-4184,2332,-4684,2504,-4184,2596,-4184,2368,-4812,2292,-4812,2116,-4336,1936,-4812,1856,-4812;
    PU2820,-4812;
    PD2724,-4812,2724,-4296,2820,-4296,2820,-4812;
    PU3144,-4400;
    PD3152,-4444,3152,-4492,3152,-4812,3064,-4812,3064,-4296,3140,-4296,3520,-4632,3552,-4664,3580,-4704,3576,-4656,3572,-4608,3572,-4296,3660,-4296,3660,-4812,3592,-4812,3204,-4472,3172,-4436,3144,-4400;
    PU3940,-4812;
    PD3940,-4184,4044,-4184,4044,-4724,4520,-4724,4520,-4812,3940,-4812;
    PU4728,-4812;
    PD4728,-4184,4832,-4184,4832,-4812,4728,-4812;
    PU5156,-4812;
    PD5156,-4184,5220,-4184,5692,-4604,5724,-4640,5760,-4684,5756,-4620,5752,-4580,5752,-4528,5752,-4184,5848,-4184,5848,-4812,5788,-4812,5308,-4376,5296,-4368,5268,-4336,5244,-4304,5252,-4364,5252,-4400,5252,-4444,5252,-4812,5156,-4812;
    PU6180,-4812;
    PD6180,-4184,6784,-4184,6784,-4268,6284,-4268,6284,-4444,6588,-4444,6588,-4528,6284,-4528,6284,-4724,6788,-4724,6788,-4812,6180,-4812;
    PU5448,-1896;
    PD5492,-1900,5532,-1908,5568,-1924,5600,-1948,5624,-1976,5644,-2004,5652,-2020,5660,-2040,5660,-2056,5664,-2076,5660,-2092,5660,-2112,5652,-2128,5644,-2144,5624,-2176,5600,-2200,5568,-2224,5532,-2240,5492,-2252,5448,-2256,5404,-2252,5364,-2240,5328,-2224,5296,-2200,5268,-2176,5248,-2144,5240,-2128,5236,-2112,5232,-2092,5232,-2076,5232,-2056,5236,-2040,5240,-2020,5248,-2004,5268,-1976,5296,-1948,5328,-1924,5364,-1908,5404,-1900,5448,-1896;
    PU4968,-2424;
    PD4992,-2424,5016,-2432,5036,-2444,5052,-2456,5068,-2476,5080,-2496,5084,-2520,5088,-2544,5084,-2568,5080,-2588,5068,-2608,5052,-2628,5036,-2640,5016,-2652,4992,-2660,4968,-2664,4944,-2660,4920,-2652,4900,-2640,4884,-2628,4868,-2608,4856,-2588,4852,-2568,4848,-2544,4852,-2520,4856,-2496,4868,-2476,4884,-2456,4900,-2444,4920,-2432,4944,-2424,4968,-2424;
    PU5688,-3092;
    PD5716,-3096,5744,-3108,5768,-3124,5788,-3144,5804,-3168,5820,-3196,5828,-3228,5832,-3260,5828,-3296,5820,-3328,5804,-3356,5788,-3380,5768,-3400,5744,-3416,5716,-3424,5688,-3428,5656,-3424,5632,-3416,5608,-3400,5584,-3380,5568,-3356,5556,-3328,5544,-3296,5544,-3260,5544,-3228,5556,-3196,5568,-3168,5584,-3144,5608,-3124,5632,-3108,5656,-3096,5688,-3092;
    PU6240,-912;
    PD6284,-916,6324,-920,6368,-928,6404,-940,6444,-956,6480,-972,6512,-992,6544,-1016,6572,-1040,6596,-1064,6616,-1096,6636,-1124,6648,-1156,6660,-1192,6668,-1224,6668,-1260,6668,-1296,6660,-1328,6648,-1364,6636,-1396,6616,-1424,6596,-1456,6572,-1480,6544,-1504,6512,-1528,6480,-1548,6444,-1564,6404,-1580,6368,-1592,6324,-1600,6284,-1604,6240,-1608,6196,-1604,6152,-1600,6108,-1592,6072,-1580,6032,-1564,5996,-1548,5964,-1528,5932,-1504,5904,-1480,5880,-1456,5860,-1424,5840,-1396,5828,-1364,5816,-1328,5808,-1296,5808,-1260,5808,-1224,5816,-1192,5828,-1156,5840,-1124,5860,-1096,5880,-1064,5904,-1040,5932,-1016,5964,-992,5996,-972,6032,-956,6072,-940,6108,-928,6152,-920,6196,-916,6240,-912;
    PU5604,-528;
    PD5620,-532,5636,-540,5648,-548,5664,-564,5672,-580,5680,-604,5684,-624,5688,-648,5684,-672,5680,-696,5672,-716,5664,-732,5648,-748,5636,-760,5620,-768,5604,-768,5588,-768,5572,-760,5556,-748,5544,-732,5532,-716,5524,-696,5520,-672,5520,-648,5520,-624,5524,-604,5532,-580,5544,-564,5556,-548,5572,-540,5588,-532,5604,-528;
    PU6428,-2112;
    PD6440,-2112,6448,-2120,6456,-2128,6464,-2140,6468,-2152,6472,-2168,6476,-2188,6476,-2208,6476,-2224,6472,-2244,6468,-2260,6464,-2276,6456,-2288,6448,-2296,6440,-2300,6428,-2304,6420,-2300,6412,-2296,6404,-2288,6396,-2276,6392,-2260,6384,-2244,6384,-2224,6380,-2208,6384,-2188,6384,-2168,6392,-2152,6396,-2140,6404,-2128,6412,-2120,6420,-2112,6428,-2112;
    PU6608,356;
    PD6644,356,6680,348,6712,340,6744,328,6776,312,6804,292,6832,268,6856,244,6876,216,6896,188,6916,156,6928,124,6940,88,6948,52,6956,12,6956,-24,6956,-64,6948,-104,6940,-140,6928,-176,6916,-208,6896,-240,6876,-268,6856,-296,6832,-320,6804,-344,6776,-364,6744,-380,6712,-392,6680,-400,6644,-408,6608,-408,6576,-408,6540,-400,6508,-392,6476,-380,6444,-364,6416,-344,6388,-320,6364,-296,6340,-268,6320,-240,6304,-208,6288,-176,6276,-140,6268,-104,6264,-64,6264,-24,6264,12,6268,52,6276,88,6288,124,6304,156,6320,188,6340,216,6364,244,6388,268,6416,292,6444,312,6476,328,6508,340,6540,348,6576,356,6608,356;
    PU;
    SP;
    IN;


    EDIT:

    falls es noch eine Erklärung braucht, musste auch erst mal kurz suchen wie die Datei zu verstehen ist.

    SP1 z.B. ist der Stift, kann also mehrere geben (z.B. bei alten Farbplottern mit 4 Farben oder so)
    PU bedeutet, das der Stift oben ist
    PD dann unten
    Und jetzt kommt das spannende: z.B. bedeutet PD1000,500, das der Stift runterfährt, und dann auf X1000 und Y500
    Jetzt gibt es ja aber wie hier sowas: PD6644,356,6680,348,6712,340,6744,328,6776 ....... Dies bedeutet, wenn ich es richtig verstanden hab, das sich X und Y immer wiederholen, als X6644, Y356, X6680, Y348 usw.

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

    Jo, aber wenn Du Text aus einer Datei liest, bekommst Du Strings, keine Zahlen. wenn der Text Zahlen repräsentiert (was hier der Fall ist), dann musst Du selbst in den entsprechenden Typ konvertieren (z.B. mit int() bei Python oder Integer.Parse() bei .Net).

    Oh ja, das ist viel. Ich würde vorschlagen, das in einen Spoiler-Tag zu wrappen: (spoiler)Hier der Text(/spoiler) und die runden Klammern durch eckige [ und ] ersetzen.

    Ok, die Zeilen beginnen immer mit einem zweistelligen "Befehl" und enden immer mit einem Semikolon.
    Dafür braucht man nicht mal RegEx.
    Das ist ein grober Ansatz, wie man da heran gehen könnte.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For Each Line In AllLines
    2. If Not String.IsNullOrEmpty(Line) Then 'Leere Zeilen (z.B. am Ende) ignorieren.
    3. Dim LastChar = Line(Line.Length - 1)
    4. If Not LastChar = ";"c Then
    5. 'Jede Zeile endet mit einem Semikolon. Ist das nicht der Fall, ist wahrscheinlich die Datei beschädigt.
    6. End If
    7. Dim Action = Line.Substring(0, 2)
    8. Dim HasArgument = (Line.Length - 2 - 1 <> 0) 'Gesamte Länge minus 2 Zeichen am Anfang minus Semikolon am Ende.
    9. Dim Argument = if(HasArgument, Line.Substring(2, Line.Length - 2 - 1), Nothing)
    10. Select Case Action
    11. Case "IN"
    12. '...
    13. Case "SP" 'Stift wählen
    14. If HasArgument Then
    15. Dim PinNumber As Integer = -1
    16. If Not Integer.TryParse(Argument, PinNumber) Then
    17. 'Nach SP muss eine Zahl folgen, die Datei ist wahrscheinlich beschädigt.
    18. End If
    19. 'Irgendwas mit PinNumber machen
    20. End If
    21. Case "PU", "PD" 'Stift hoch/runter und bewegen
    22. '...
    23. If HasArgument Then
    24. Dim Parts = Argument.Split(","c)
    25. If Parts.Length Mod 2 <> 0 Then
    26. 'Wenn immer Paare von X- und Y-Werten vorkommen sollen, muss die Anzahl gerade sein.
    27. End If
    28. For Each i In Parts
    29. Dim CoordinatePart As Integer
    30. If Not Integer.TryParse(i, CoordinatePart) Then
    31. 'Datei beschädigt
    32. End If
    33. '...
    34. Next
    35. End If
    36. End Select
    37. End If
    38. Next

    Man müsste das jetzt noch in einer Klasse kapseln.
    Ich denke da an sowas:

    VB.NET-Quellcode

    1. Class PltFile
    2. ReadOnly Property Instructions As IEnumerable(Of PltInstruction)
    3. Sub New(FilePath As String)
    4. Class PltInstruction
    5. ReadOnly Prperty Kind As InstructionKind
    6. Sub New(NewKind As InstructionKind)
    7. Class ScalarPltInstruction
    8. Inherits PltInstruction
    9. ReadOnly Property Value As Integer
    10. Sub New(NewInstructionType As InstructionType, NewValue As Integer)
    11. Class CoordinateListPltInstruction
    12. Inherits PltInstruction
    13. ReadOnly Property Coordinates As IEnumerable(Of Point)
    14. Sub New(NewInstructionType As InstructionType, NewCoordinates As IEnumerable(Of Point))
    15. Enum InstructionKind
    16. IN 'Ich weiß jetzt nicht, was das ist
    17. PinUp
    18. PinDown
    19. SelectPin

    Und in der Pars-Funktion der PltFile-Klasse werden in eine Liste die unterschiedlichen Instanzen von PltInstruction, ScalarPltInstruction und CoordinateListPltInstruction abgelegt.
    Beispielsweise wäre PinDown ein CoordinateListPltInstruction. Erster Parameter des Konstruktors ist InstructionKind.PinDown und der zweite Parameter ist die Liste der Koordinaten, die man aus der Datei gelesen hat.

    Dadurch kann man die Datei recht einfach verwenden:

    VB.NET-Quellcode

    1. Dim File As New PltFile("Pfad")
    2. For Each Instruction In File.Instructions
    3. Select Case Instruction.Kind
    4. Case InstructionKind.IN
    5. 'Wie gesagt, ich weiß nicht, was das macht
    6. Case InstructionKind.SelectPin
    7. 'Wenn es sich um einen Befehl handelt, der einen Stift auswählt, ist klar, dass es ein einzelnes Argument benötigt -> wird von ScalarPltInstruction gekapselt.
    8. Dim Casted = DirectCast(Instruction, ScalarPltInstruction)
    9. PinAuswählen(Casted.Value)
    10. Case InstructionKind.PinDown
    11. PinRunterFahren()
    12. Dim Casted = DirectCast(Instruction, CoordinateListPltInstruction)
    13. For Each i In Casted.Points
    14. ZuPunktFahren(i)
    15. Next
    16. '...
    17. End Select
    18. Next
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Also echt, ich bin doch mal voll der Depp. Ich hätte gleich sagen sollen um was es geht, dann hättest du dir nicht so viel Mühe machen müssen. Aber trotzdem vielen Dank dafür! :thumbup:

    Es gibt in der Datei nur SP, also SP1, weil ich nur eine Grafik in schwarz/weiß erstelle. Das war jetzt echt ein blödes Beispiel, weil da mehrere Farben drin sind. Das SP1, und am Schluß das SP0 kann man ignorieren, genauso wie IN, das steht bei jeder Datei dabei und hat sozusagen keinen Nutzen, außer das die Datei anfängt.
    Interessant ist nur PD und PU, und halt die Koordinaten dazu. Ob das immer Paare sind bei PD kann ich nicht sagen, kann also sein das die letzte Koordinate nur noch X ist. Aber im Prinzip ist es X,Y,X,Y,usw.
    Die Koordinaten brauch ich, um zwei Schrittmotoren anzusteuern, also in X und Y.
    Wenn ich ehrlich bin, hab ich grad keine Ahnung wie ich aus so einem Wust wie es bei PD vorkommen kann, die Koordinaten immer abwechselnd rauszuholen.

    Hier ist noch mal der "komplette" Python Code:

    Python-Quellcode

    1. for data in dataset:
    2. arr = data.split(" ")
    3. if arr[0] <> "SP1;" and arr[0] <> "SP0;":
    4. lsrx = arr[0]
    5. lsr = lsrx[0]+lsrx[1]
    6. if len(lsrx) == 3:
    7. x = int(lsrx[2])
    8. elif len(lsrx) == 4:
    9. x = int(lsrx[2]+lsrx[3])
    10. elif len(lsrx) == 5:
    11. x = int(lsrx[2]+lsrx[3]+lsrx[4])
    12. elif len(lsrx) == 6:
    13. x = int(lsrx[2]+lsrx[3]+lsrx[4]+lsrx[5])
    14. elif len(lsrx) == 7:
    15. x = int(lsrx[2]+lsrx[3]+lsrx[4]+lsrx[5]+lsrx[6])
    16. lsry = arr[1]
    17. if len(lsry) == 2:
    18. y = int(lsry[0])
    19. elif len(lsry) == 3:
    20. y = int(lsry[0]+lsry[1])
    21. elif len(lsry) == 4:
    22. y = int(lsry[0]+lsry[1]+lsry[2])
    23. elif len(lsry) == 5:
    24. y = int(lsry[0]+lsry[1]+lsry[2]+lsry[3])
    25. elif len(lsry) == 6:
    26. y = int(lsry[0]+lsry[1]+lsry[2]+lsry[3]+lsry[4])
    27. if lsr == "PD":
    28. mach was
    29. if lsr == "PU":
    30. mach was anderes
    Es gibt in der Datei nur SP, also SP1, weil ich nur eine Grafik in schwarz/weiß erstelle.

    Naja, Wiederverwendungswert.
    kann also sein das die letzte Koordinate nur noch X ist

    Also wenn ich das richtig verstanden habe, fährt der Plotter nicht immer die Diagonale zum nächsten X-Y-Paar (so wie links im Bild), sondern immer zuerst den X-Teil, dann den Y-Teil, dann wieder X und so weiter (wie rechts im Bild).

    In dem Fall müsste man in der CoordinateListPltInstruction-Klasse die Coordinates-Property austauschen:

    VB.NET-Quellcode

    1. Class CoordinateListPltInstruction
    2. Inherits PltInstruction
    3. ReadOnly Property Movements As IEnumerable(Of Movement)
    4. Sub New(NewInstructionType As InstructionType, NewCoordinates As IEnumerable(Of Point))
    5. Structure Movement
    6. ReadOnly Property Axis As Axis
    7. ReadOnly Property Position As Integer
    8. Sub New(NewAxis As Axis, NewPosition As Integer)
    9. Enum Axis
    10. X
    11. Y

    Also ich würds trotzdem komplett verarbeiten. Wenn mans mal braucht, hat mans schon griffbereit.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich bin eiglich nur verwirrt, warum Niko glaubt, helfen zu können.
    Ich für mein Teil verstehe nur Bahnhof.
    Du servierst einen unvollständigen, unverständlichen Code, dazu eine Beispiel-Datei, die nicht relevant ist, und nu sollemer den unvollständigen, unverständlichen Code nach vb.net übersetzen.

    ?( ?( ?(

    Also den Code kann ich nicht übersetzen, und ich hab auch kein Plan, was der macht, und was also der gewünschte vb.net-Code denn machen soll.
    Hilfreich wäre etwa eine relevante Beispiel-Datei, und ein gewünschter Beispiel-Output, dass man überlegen kann, mit welchem Code man aus dem Input den gewünschten Output generieren könnte.


    Aber auf einmal redest du dann von dem FileStream und dem StreamReader, die du mit ForEach durchlaufen möchtest.

    Welcher FileStream oder StreamReader denn?

    Aber ich kann dir mitteilen: Zumindest bis Framework 4.0 kann man weder FileStreams noch StreamReader mit Foreach durchlaufen, ganz im Allgemeinen.
    Was ich dir empfehlen kann, wenn du dich für die Klassen FileStream und StreamReader interessierst: Suche sie im ObjectBrowser auf, oder besser noch inne Msdn - in letzterer finden sich bestimmt auch Codebeispiele zur richtigen Verwendung dieser Klassen.

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

    Also in meinem Beitrag #5 in dem Spoiler, das ist die Datei die eingelesen wird. Die sieht tatsächlich so aus.

    Also ich hab einen Button, mit dem öffne ich per OpenFileDialog die Datei. Das funktioniert soweit. Nur ist die Datei ja nun in einem Filestream.

    VB.NET-Quellcode

    1. Dim plt_File As New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)

    Aus der eingelesenen Datei interessiert nur folgendes: ob in der Zeile PU steht und die Kordinaten dahinter. Sind zwei Koordinaten, getrennt mit einem Komma. Am Zeilenende steht ein Semikolon. Die Zeile sieht z.B. so aus: PU940,3928;
    Dann gibt es noch Zeilen mit PD, mit einer Anzahl an Koordinaten, die man praktisch nicht weiß. So eine Zeile sieht so aus: PD856,5104,772,5100,688,5092,608,5084,524,5072, .......
    Die Koordinaten, die dahinter stehen, sind X und Y Koordinaten, immer abwechselnd.
    Jede Zeile wird einem Semikolon beendet.

    Das 1. Problem welches ich nun hab, ist folgendes: nach dem die Datei mit OFD geöffnet wurde, soll nichts weiter passieren. Erst wenn ich einen anderen Button drücke, soll die Datei "verarbeitet/geparst" werden. Nur, ich weiß nicht wie ich nun mit dem "plt_File" in dem Sub von dem zweiten Button weiter arbeiten kann. Jeder Versuch endete in einer anderen Fehlermeldung. Ich hab heute so viel probiert, das ich gar nicht mehr sagen kann, welche das alle waren.

    Das 2. Problem ist, das ich es nicht hinbekomme, die Datei Zeilenweise auszulesen, und wenn PU bzw. PD kommt, die erste Koordinate sagen wir mal der Variable temp_x zuweise, und die zweite Koordinate temp_y, bzw. bei PD können ja mehr als 2 Koordinaten stehen.

    EDIT: was meinst du mit einer relevanten Beispiel-Datei. Wie gesagt, der Code im Spoiler von Beitrag 5 ist tatsächlich so.
    zu 1) Niemand zwingt dich, die Datei sofort zu verarbeiten, nachdem du sie im OFD ausgesucht hast.
    Der Ofd merkt sich ja die gewählte Datei - die kannste abrufen, wann immer du sie brauchst - etwa dann, wenn du auf den anneren button klickst.

    zu 2): FileStream hier nix gutt - nimm StreamReader. Gugge Msdn, wie man damit zeilenweise eine Datei ausliest. Bei etwas mehr Sprachkenntnis ist Msdn auch in diesem Falle entbehrlich, sondern es genügt auch der ObjectBrowser, um die richtige Verwendung sich zu erschließen.
    Weiters kommt man auch über den OB immer direkt zum passenden Msdn-Artikel - gugge VisualStudio richtig nutzen (Google ist nicht deine Mami)

    3) noch immer offen ist, was eiglich bei rauskommen soll: Eine Liste mit Punkten? Linien? Rechtecke? eine Liste mit PU-Punkten, und eine annere Liste mit PD-Punkten? ...
    Zu 1.:
    Stimmt das so?

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Public Class Form1
    3. dim plt_File as string
    4. Public Sub ÖffnenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ÖffnenToolStripMenuItem.Click
    5. With OpenFileDialog1
    6. .Title = "Plotterdatei öffnen"
    7. '.FileName = "Grafik.plt"
    8. .Filter = "Plotterdatei (*.plt)|*.plt"
    9. .RestoreDirectory = True
    10. End With
    11. End Sub
    12. Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    13. If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
    14. plt_File = New StreamReader(plt_File)
    15. End If
    16. ' Hier dann die weitere Verarbeitung der Datei.
    17. End Sub
    18. End Class


    Zu 2.:
    Falls #1 stimmt, hab ich dann ja die Datei eingelesen. Nun kann ich die Datei zeilenweise einlesen, und wenn am Anfang der Zeile ein PU oder PD steht, brauch ich die Koordinaten, die dahinter stehen. Ich weiß aber nicht wie ich diese abwechselnd einlesen kann.

    Zu 3.:
    Das ist eine Datei um zu plotten. Da stehen die Koordinaten drin wo der Plotter hinfahren soll, und ob Stift hoch oder Stift runter.
    Nur mal als Beispiel: hier sieht man was raus kommt wenn man die Datei plottet: winline.com/evalpen_center.html und hier ist die entsprechende PLT Datei dazu winline.com/images/plotfiles/GL-C-O.plt
    In der Datei gibt es noch SP2, SP3 usw., das interessiert mich aber nicht, da es bei mir nur SP1 gibt (selbst das interessiert nicht), da nur schwarz/weiß Grafiken erstellt werden.

    Hier noch ein kurzer Pseudo-Code, ich hoffe mal das es verständlicher ist was gemeint ist.

    VB.NET-Quellcode

    1. ​Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    2. If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
    3. plt_File = New StreamReader(plt_File)
    4. End If
    5. ' Schleife beginnen
    6. ' Zeilenweise Datei einlesen
    7. if "PU"
    8. ' 1. Koordinate ist X
    9. ' 2. Koordinate ist Y
    10. end if
    11. if "PD"
    12. ' 1. Koordinate ist X
    13. ' 2. Koordinate ist Y
    14. ' 3. Koordinate ist wieder X
    15. ' 4. Koordinate ist wieder Y
    16. ' Dieses IF darf aber erst verlassen werden, wenn die komplette Zeile mit den Koordinaten abgearbeitet wurde
    17. end if
    18. ' Schleife verlassen
    19. End Sub
    Das stimmt, war irgendwie blöd die Frage. :)

    Hab das hinbekommen mit dem StreamReader, habe aber nun ein anderes Problem.

    Also ich hab folgenden Code, welcher mir nun den Stream verarbeitet:

    VB.NET-Quellcode

    1. For Each Line In dataset
    2. If Not String.IsNullOrEmpty(Line) Then 'Leere Zeilen (z.B. am Ende) ignorieren.
    3. Dim LastChar = Line(Line.Length - 1)
    4. If Not LastChar = ";"c Then
    5. 'Jede Zeile endet mit einem Semikolon. Ist das nicht der Fall, ist wahrscheinlich die Datei beschädigt.
    6. End If
    7. Dim Action = Line.Substring(0, 2)
    8. Dim HasArgument = (Line.Length - 2 - 1 <> 0) 'Gesamte Länge minus 2 Zeichen am Anfang minus Semikolon am Ende.
    9. Dim Argument = If(HasArgument, Line.Substring(2, Line.Length - 1 - 1), Nothing)
    10. Select Case Action
    11. Case "PU" 'Stift oben
    12. '...
    13. If HasArgument Then
    14. Dim Parts = Argument.Split(","c)
    15. If Parts.Length Mod 2 <> 0 Then
    16. 'Wenn immer Paare von X- und Y-Werten vorkommen sollen, muss die Anzahl gerade sein.
    17. End If
    18. For Each i In Parts
    19. Dim CoordinatePart As Integer
    20. If Not Integer.TryParse(i, CoordinatePart) Then
    21. 'Datei beschädigt
    22. End If
    23. FastColoredTextBox1.InsertText(CoordinatePart & ",", An)
    24. Next
    25. End If
    26. Case "PD" 'Stift unten
    27. '...
    28. If HasArgument Then
    29. Dim Parts = Argument.Split(","c)
    30. If Parts.Length Mod 2 <> 0 Then
    31. 'Wenn immer Paare von X- und Y-Werten vorkommen sollen, muss die Anzahl gerade sein.
    32. End If
    33. For Each i In Parts
    34. Dim CoordinatePart As Integer
    35. If Not Integer.TryParse(i, CoordinatePart) Then
    36. 'Datei beschädigt
    37. End If
    38. '...
    39. Next
    40. End If
    41. End Select
    42. End If
    43. Next


    Der Anfang der Datei welche eingelesen wird, sieht so aus:
    Spoiler anzeigen
    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;


    Mein Problem ist nun, dass die Variable Action nur beim ersten durchlaufen der Schleife einen Wert hat, danach ist Action immer leer. An was kann das liegen?
    In der Variable Line steht aber die komplette Zeile drin, nur werden die ersten zwei Buchstaben nicht mehr gelesen.
    So sieht es aus wenn in der Action etwas drin steht:


    Und ich habe noch ein anderes Problem, und zwar wenn ich die ersten beiden Zeilen lösche, hab ich direkt die Zeile PU, da springt das Programm dann auch in den entsprechenden Select, das Wertepaar wird ermittelt, und nacheinander "ausgegeben". Wie mache ich das nun, dass der erste Wert in die Variable temp1, und zweite Wert in temp2 geschrieben wird?
    Stichpunkt objektorientierte Programmierung - die eignet sich hervorragend dazu. Stell dir dazu folgendes vor:

    Du hast eine Klasse Command. Diese hat folgende Struktur :

    Quellcode

    1. Klasse Command
    2. - CommandType 'PU, PD
    3. - X-Value
    4. - Y-Value

    Jetzt hast du noch eine Funktion zum erstellen eines solchen Commands und zudem eine (achtung, Stichwort!) List, in der du jedes erstellte Command hinzufügst.
    Besagte Funktion könnte so aussehen (Pseudocode):

    Quellcode

    1. Foreach Line in File
    2. string lineCommand = Line.Substring(0, 2)
    3. string() lineArgs = Line.Substring(2, line.Length - 2).Split(",")
    4. ' (sicherstellen, dass es sich um eine gerade anzahl Zahlen handelt)
    5. For i = 0 To lineArgs.Length Step 2
    6. integer xValue = ConvertToInteger(lineArgs(i))
    7. integer yValue = ConvertToInteger(lineArgs(i + 1)) 'vorher sicherstellen, dass es sich nicht um Buchstaben oder Sonderzeichen handelt
    8. Command command = new Command(lineCommand, xValue, yValue)
    9. CommandList.Add(command)
    10. End For
    11. End Foreach


    Dann kannst du später z.B. mit einer ForEach-Schleife alle deine Commands in der CommandList durchgehen ;)
    Hi!

    Also auch wenn ich keine bis wenig Ahnung habe, denke ich nicht das es so funktioniert, oder nicht so in der Art (oder ich kapier mal wieder nichts).

    Hilft es wenn ich sage das der Content vom StreamReader schon eine Liste ist? Also jede Zeile ist ein Item der Liste.

    Ich brauch die beiden Koordinaten direkt, da ich damit sofort was anderes machen muss, und so wie du es beschreibst muss ich dann noch mal in einer Schleife die Liste durchlaufen.

    Also so wie es oben ist wäre würde es doch eigentlich auch gehen. Ich verstehe halt nur nicht warum beim 2. Durchlauf der Schleife nichts mehr in Action steht.
    Eigentlich mache ich das nicht gerne, aber ich muss trotzdem mal nachhaken, und fragen warum beim 2. Durchlauf der Schleife die Variable nicht mehr beschrieben wird.
    Ich hab schon alles mögliche ausprobiert, die bleibt trotzdem immer leer. Ein Fehler wird mir auch nicht angezeigt.

    Dies habe ich nun gelöst. War zwar für mich gar nicht so einfach, aber es hat funktioniert. Habe die Datei falsch gesplittet.

    Eine Frage habe ich allerdings noch. 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?

    VB.NET-Quellcode

    1. For Each i In Parts
    2. Dim CoordinatePart As Integer
    3. If Not Integer.TryParse(i, CoordinatePart) Then
    4. 'Datei beschädigt
    5. End If
    6. '...
    7. tempX =Parts(0)
    8. tempY =Parts(1)
    9. Next

    Oder wie kann man das sonst machen?

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