Auslesen einzelner Wörter aus einer Zeile einer Textdatei (Eigentlich .dat, aber die bekomme ich nicht ausgelesen)

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von frautomke.

    Auslesen einzelner Wörter aus einer Zeile einer Textdatei (Eigentlich .dat, aber die bekomme ich nicht ausgelesen)

    Hallo, ich bin gerade erst dabei mich in Visual Basic einzuarbeiten ?(

    Mein Problem ist: Ich habe eine Datei in der Wetterdaten stehen, die ersten ca. 30 Zeilen können unbeachtet gelassen werden. Dies erkenne ich an "***" im Code, denn danach beginnen die Werte.
    Die Werte sind allerdings pro Stunde alle nebeneinander geschrieben. Aus dieser Zeile brauche ich den 3, 4, 5, 6 und 12 Wert. Und ich komme einfach nicht weiter, ich kann den ersten Teil abschneiden oder alle Leerzeichen entfernen 8-)
    Nur leider bringt mich das nicht weiter. Vielleicht habt ihr ein paar Tipps oder Stichworte nach denen ich google'n kann? Danke :whistling:

    Datei: (So ungefähr sieht eine Zeile aus)

    ***
    3849500 2920500 1 1 1 0.2 1019 200 4.7 6 3.8 98 0 0 307 -320 1

    Code:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Collections
    4. Public Class Data
    5. Public Function RemoveExtraSpaces(input_text As String) As String
    6. Dim rsRegEx As System.Text.RegularExpressions.Regex
    7. rsRegEx = New System.Text.RegularExpressions.Regex("\s+")
    8. Return rsRegEx.Replace(input_text, " ").Trim()
    9. End Function
    10. Public FilePath As String
    11. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    12. Dim OpenFileDialog2 As New OpenFileDialog()
    13. OpenFileDialog2.Filter = "Text Files|*.txt"
    14. OpenFileDialog2.Title = "Select a Text File"
    15. If OpenFileDialog2.ShowDialog() = DialogResult.OK Then
    16. FilePath = OpenFileDialog2.FileName
    17. Dim s() As String = IO.File.ReadAllLines(FilePath)
    18. Dim u As String = Environment.NewLine
    19. Dim x As Integer = 0
    20. For i = 0 To s.Length - 1
    21. If s(i).Contains("***") Then
    22. u = (i + 1).ToString & Environment.NewLine
    23. ListBox1.Items.Add("Zeilenanzahl: " + u)
    24. For x = u To s.Length - 1
    25. ListBox1.Items.Add(s(i + 1))
    26. i = i + 1
    27. Next x
    28. End If
    29. Next
    30. End If
    31. End Sub
    32. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    33. Dim fileReader = My.Computer.FileSystem.OpenTextFileReader(FilePath)
    34. Dim stringReader As String
    35. stringReader = fileReader.ReadToEnd()
    36. Dim TestArray() As String = Split(stringReader, " ")
    37. Dim LastNonEmpty As Integer = -1 '// Löscht alle Leerzeichen
    38. For i As Integer = 0 To TestArray.Length - 1
    39. If TestArray(i) <> "" Then
    40. LastNonEmpty += 1
    41. TestArray(LastNonEmpty) = TestArray(i)
    42. ListBox2.Items.Add(TestArray(i))
    43. End If
    44. Next
    45. ReDim Preserve TestArray(LastNonEmpty)
    46. End Sub
    47. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    48. ListBox1.Items.Clear()
    49. ListBox2.Items.Clear()
    50. End Sub
    51. End Class


    *Topic verschoben, BBCode angepasst*
    8|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @frautomke Willkommen im Forum. :thumbup:
    Ich nehme mal an, dass Du bei den 3, 4, 5, 6 und 12 Wert bei 1 angefangen hast zu zählen.
    Du brauchst eine Schleife über ale Zeilen Deiner Datei, dann hast Du die Einzelwerte einer Zeile, das Zauberwort wurde Dir von @petaod genannt:

    VB.NET-Quellcode

    1. For Each line in IO.File.ReadLines(PFAD_ZU_DEINEFR_DATEI) ' Schleife über alle Zeilen
    2. Dim parts() = line.Split(new Char() {" "c}, StringSplitOptions.RemoveEmptyEntries) ' falls mehrere Leerzeichen nebeneinander stehen, werden die wie eins behandelt
    3. DoAny1(parts(2))
    4. DoAny2(parts(3))
    5. DoAny3(parts(4))
    6. DoAny4(parts(5))
    7. DoAny5(parts(11))
    8. Next
    Die Prozeduren DoAnyX() machen mit den Strings das, was sie tun sollen, das musst Du wissen.
    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!

    frautomke schrieb:

    per Split in einzelne Zeilen zu unterteilen
    ReadLines gibt dir doch schon die einzelnen Zeilen.
    Du musst doch nur noch die Felder innerhalb der Zeilen durch Split selektieren.

    Aber @RodFromGermany hat doch eigentlich alles schon vorgekaut.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @frautomke Wenn Du eine bessere Lösung siehst, ersetze die alte durch die neue.
    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!
    @petaod @frautomke hat ih ihrem 1. Post die ganze Form gepostet, da ist natürlich viel Spreu dabei und wenig Weizen. ;)
    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!
    @petaod & @RodFromGermany :whistling: Macht euch nicht über mich lustig :D

    Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Collections
    4. Public Class Data
    5. Public FilePath As String
    6. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    7. Dim OpenFileDialog2 As New OpenFileDialog()
    8. OpenFileDialog2.Filter = ".dat Files|*.dat"
    9. If OpenFileDialog2.ShowDialog() = DialogResult.OK Then
    10. FilePath = OpenFileDialog2.FileName
    11. Dim s() As String = IO.File.ReadAllLines(FilePath)
    12. Dim Values As String()
    13. Dim m As Boolean = False
    14. For i = 0 To s.Length - 1
    15. If m = True Then
    16. ListBox1.Items.Add(s(i))
    17. Values = s(i).Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    18. ListBox2.Items.Add(Values(2))
    19. ListBox2.Items.Add(Values(3))
    20. ListBox2.Items.Add(Values(4))
    21. ListBox2.Items.Add(Values(5))
    22. ListBox2.Items.Add(Values(11))
    23. End If
    24. If s(i).Contains("***") Then
    25. m = True
    26. End If
    27. Next
    28. End If
    29. End Sub
    30. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    31. ListBox1.Items.Clear()
    32. ListBox2.Items.Clear()
    33. End Sub
    34. End Class



    (Ich nehme gerne Tipps entgegen :D beschäftige mich erst seit zwei Tagen mit VB und Programmieren ist generell nicht meine Paradedisziplin :D - ich hätte die ersten zwei Semester nicht alle per "Copy & Paste" bearbeiten sollen)
    8|

    frautomke schrieb:

    Macht euch nicht über mich lustig
    Niemand macht sich über Dich lustig.
    Ich finde es gut, wie Du Dein Problem gelöst hast, nur ist die Auflistung der Zieldaten einfach so untereinander noch nicht der Olymp.
    Ich hab mal Deinen Code ein wenig glatt gezogen, kommentieren muss ich da wohl nix:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Data
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Using dlg As New OpenFileDialog()
    4. dlg.Filter = "Dat Files|*.dat|All Files|*.*"
    5. If dlg.ShowDialog() <> DialogResult.OK Then
    6. Return
    7. End If
    8. For Each line In IO.File.ReadLines(dlg.FileName)
    9. If line.StartsWith("***") Then
    10. Continue For
    11. End If
    12. ListBox1.Items.Add(line)
    13. Dim Values() = line.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    14. ListBox2.Items.Add(Values(2))
    15. ListBox2.Items.Add(Values(3))
    16. ListBox2.Items.Add(Values(4))
    17. ListBox2.Items.Add(Values(5))
    18. ListBox2.Items.Add(Values(11))
    19. Next
    20. End Using
    21. End Sub
    22. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    23. ListBox1.Items.Clear()
    24. ListBox2.Items.Clear()
    25. End Sub
    26. End Class
    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!

    frautomke schrieb:

    Funktioniert bei mir irgendwie nicht.
    Meine Button heißen anders (Du: 2 und 3; ich: 1 und 2) ;)
    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 hatte ich schon Berücksichtigt ^^ Aber er sagt bei den ListBox2.Items.Add(Values...) "Der Index war außerhalb des Arraybereichs."

    Den Fehler hatte ich bei meinem auch erst, deswegen hatte ich die ***-Abfrage unter die Ausgabe gepackt, damit hatte es dann funktioniert - hier leider nicht :thumbdown: :D
    8|
    @frautomke Poste mal einen Datensatz.
    ====
    Ich glaube, Du greifst bei ListBox2.Items.Add(Values(11)) daneben, weil in der Zeile weniger Einzelwerte stehen.
    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!

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

    @RodFromGermany - sind eigentlich knapp 9000 Zeilen, hab es etwas gekürzt (Die Leerzeichen-Anzahl stimmt hier nicht)

    Koordinatensystem : Lambert konform konisch
    Rechtswert : 3849500 Meter
    Hochwert : 2920500 Meter
    Hoehenlage : 2 Meter ueber NN
    Erstellung des Datensatzes im Mai 2016

    Art des TRY : mittleres Jahr
    Bezugszeitraum : 1995-2012
    Datenbasis : Beobachtungsdaten Zeitraum 1995-2012

    Format: (i7,1x,i7,1x,i2,1x,i2,1x,i2,1x,f5.1,1x,i4,1x,3i,1x,f4.1,1x,i1,1x,f4.1,1x,i3,1x,i4,1x,i4,1x,i3,1x,i4,2x,i1)

    Reihenfolge der Parameter:
    RW Rechtswert [m] {3670500;3671500..4389500}
    HW Hochwert [m] {2242500;2243500..3179500}
    MM Monat {1..12}
    DD Tag {1..28,30,31}
    HH Stunde (MEZ) {1..24}
    t Lufttemperatur in 2m Hoehe ueber Grund [GradC]
    p Luftdruck in Standorthoehe [hPa]
    WR Windrichtung in 10 m Hoehe ueber Grund [Grad] {0..360;999}
    WG Windgeschwindigkeit in 10 m Hoehe ueber Grund [m/s]
    N Bedeckungsgrad [Achtel] {0..8;9}
    x Wasserdampfgehalt, Mischungsverhaeltnis [g/kg]
    RF Relative Feuchte in 2 m Hoehe ueber Grund [Prozent] {1..100}
    B Direkte Sonnenbestrahlungsstaerke (horiz. Ebene) [W/m^2] abwaerts gerichtet: positiv
    D Diffuse Sonnenbetrahlungsstaerke (horiz. Ebene) [W/m^2] abwaerts gerichtet: positiv
    A Bestrahlungsstaerke d. atm. Waermestrahlung (horiz. Ebene) [W/m^2] abwaerts gerichtet: positiv
    E Bestrahlungsstaerke d. terr. Waermestrahlung [W/m^2] aufwaerts gerichtet: negativ
    IL Qualitaetsbit bezueglich der Auswahlkriterien {0;1;2;3;4}

    RW HW MM DD HH t p WR WG N x RF B D A E IL
    ***
    3849500 2920500 1 1 1 0.2 1019 200 4.7 6 3.8 98 0 0 307 -320 1
    3849500 2920500 1 1 2 1.6 1019 233 5.9 7 4.2 99 0 0 308 -320 1
    3849500 2920500 1 1 3 2.7 1018 258 6.8 8 4.5 100 0 0 309 -320 1
    3849500 2920500 1 1 4 2.9 1018 261 7.1 8 4.6 100 0 0 308 -320 1
    3849500 2920500 1 1 5 3.1 1017 261 7.1 8 4.6 100 0 0 306 -320 1
    3849500 2920500 1 1 6 3.1 1017 260 7.0 8 4.7 100 0 0 307 -320 1
    3849500 2920500 1 1 7 3.2 1016 259 6.7 8 4.7 100 0 0 307 -320 1
    3849500 2920500 1 1 8 3.1 1016 258 6.4 8 4.7 100 0 0 308 -320 1
    3849500 2920500 1 1 9 3.0 1016 276 5.6 8 4.7 99 0 0 309 -320 1
    3849500 2920500 1 1 10 2.8 1016 284 4.8 8 4.6 98 0 26 310 -320 1
    3849500 2920500 1 1 11 3.3 1017 281 4.8 5 4.5 95 14 69 296 -320 1
    3849500 2920500 1 1 12 3.5 1017 279 5.9 4 4.4 90 16 95 275 -319 1
    3849500 2920500 1 1 13 3.8 1017 290 5.7 3 4.3 88 46 105 263 -319 1
    3849500 2920500 1 1 14 3.7 1017 292 6.1 4 4.3 87 32 96 261 -319 1
    3849500 2920500 1 1 15 3.6 1017 297 5.9 2 4.2 86 28 69 254 -318 1
    3849500 2920500 1 1 16 3.1 1017 291 5.0 3 4.1 86 3 27 246 -317 1
    3849500 2920500 1 1 17 2.3 1017 287 4.3 3 4.0 88 0 0 250 -315 1
    3849500 2920500 1 1 18 1.8 1018 296 4.2 3 3.9 90 0 0 249 -311 1
    3849500 2920500 1 1 19 1.8 1018 297 4.4 4 3.9 91 0 0 255 -308 1
    3849500 2920500 1 1 20 1.4 1018 289 4.1 4 3.9 91 0 0 259 -307 1
    3849500 2920500 1 1 21 1.1 1018 285 4.0 2 3.8 92 0 0 245 -307 1
    3849500 2920500 1 1 22 0.7 1019 286 4.3 2 3.7 93 0 0 231 -307 1
    3849500 2920500 1 1 23 0.9 1019 277 4.9 4 3.7 93 0 0 243 -308 1
    3849500 2920500 1 1 24 1.2 1019 282 4.9 5 3.8 92 0 0 260 -309 1
    3849500 2920500 1 2 1 1.2 1019 280 4.9 5 3.8 93 0 0 266 -310 1
    3849500 2920500 1 2 2 1.2 1019 287 4.6 6 3.9 95 0 0 270 -313 1
    3849500 2920500 1 2 3 1.2 1019 289 3.7 6 3.9 95 0 0 274 -316 1
    3849500 2920500 1 2 4 1.1 1019 293 3.7 5 3.9 94 0 0 267 -316 1
    3849500 2920500 1 2 5 0.6 1019 293 3.9 6 3.8 96 0 0 264 -315 1
    3849500 2920500 1 2 6 0.8 1019 290 3.3 7 3.8 97 0 0 272 -313 1
    3849500 2920500 1 2 7 0.3 1019 273 2.9 4 3.8 96 0 0 260 -312 1
    3849500 2920500 1 2 8 -0.3 1019 273 3.0 3 3.6 97 0 0 238 -311 1
    3849500 2920500 1 2 9 0.0 1020 267 3.1 3 3.6 97 0 0 232 -311 1
    3849500 2920500 1 2 10 0.6 1020 279 3.4 5 3.6 94 8 31 241 -312 1
    8|