.txt zu einer Liste konvertieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    .txt zu einer Liste konvertieren

    Hallo allerseits!

    Ich will folgende .txt-Datei in ein DataGridView einfügen:

    Quellcode

    1. ​#Beispiel-Liste
    2. #Vorname Nachname geb_datum Größe Gewicht
    3. Harald Bauer 01.08.1979 180
    4. Max Müller 07.02.1995

    ! Die vier Leerzeichen sind eigentlich Tabstops. Das kann man hier leider nicht anders einfügen.
    (Darum ist die originale Datei auch noch im Anhang.)

    Ich habe bereits diesen Ansatz probiert, jedoch funktioniert dieser in meinem Fall nicht da hinten oft nicht alle "Felder" ausgefüllt sind.


    Vielen Dank im Voraus
    Dateien
    • Beispiel.txt

      (112 Byte, 112 mal heruntergeladen, zuletzt: )
    Hi Marv,

    wo genau kommst du nicht weiter?

    Ich tät das glaub so machen:
    1. Zeilenweise einlesen
    2. Zeile beim Tabstop splitten

    Nun hast du ein Array das die Elemente einer Zeile getrennt beinhaltet. Damit kannst du dann weiter arbeiten.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Marv Nicht ein DGV, sondern eine DataTable.
    Wie Du die Einzeldaten erhältst, entnimmst Du dem Post von @mrMo . Das Datum konvertierst Du bitte in eine DateTime-Instanz: DateTime.ParseExact(), gugst Du hier.
    Wie das mit den Daten, der Tabelle und dem DGV geht, gugst Du hier.
    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!

    mrMo schrieb:

    wo genau kommst du nicht weiter?


    Hier:

    VB.NET-Quellcode

    1. Public Sub ReadAllEntries()
    2. Dim appPath As String = pfad_open
    3. Dim fileEntries As New List(Of String)
    4. If Not File.Exists(appPath) Then
    5. MsgBox("Die ausgewählte Datei gibt es nicht.", MsgBoxStyle.Information, Title:="Information")
    6. Exit Sub
    7. End If
    8. Try
    9. ' Alles in eine Liste bringen:
    10. Dim reader As StreamReader = New StreamReader(appPath)
    11. fileEntries.Clear()
    12. ' Fängt ab der dritten Zeile zum auslesen an
    13. Dim zeile As Integer = 1
    14. Do Until reader.Peek = ""
    15. zeile = zeile + 1
    16. fileEntries.Add(reader.ReadLine(zeile))
    17. Loop
    18. reader.Close()
    19. Catch ex As Exception
    20. ' Die Datei ist leer:
    21. MsgBox("Die ausgewählte Datei ist leer.", MsgBoxStyle.Information, Title:="Information")
    22. End Try
    23. For Each line As String In fileEntries
    24. Dim parts() As String = Split(line, " ")
    25. Try
    26. ' Die ausgelsesenen Daten in das DataGrid übertragen:
    27. DataGridView1.Rows.Add(parts(0), parts(1), parts(2), parts(3), parts(4))
    28. Catch ex As Exception
    29. MsgBox("Es gibt einen Fehler beim auslesen!", MsgBoxStyle.Critical, Title:="Fehler!")
    30. End Try
    31. Next
    Geil, ich frage wo du nicht weiter kommst, du antwortest mit
    Hier: Und nem Haufen Code

    Dann rate ich mal:
    reader.Peek gibt meines Wissens nach -1 zurück wenn nix mehr da ist, nicht nen Leeren String

    Zudem tät ich die Daten erst in eine DataTable schreiben, welche dann als DataSource des Grids genutzt wird.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Marv Ignorant und beratungsresistent?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Globalization
    3. Public Class Form1
    4. Private table As DataTable
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. InitDataTable()
    7. ReadAllEntries()
    8. End Sub
    9. Private Sub InitDataTable()
    10. Me.table = New DataTable()
    11. Me.table.TableName = "Beispiel"
    12. Me.table.Columns.Add(New DataColumn() With { _
    13. .ColumnName = "Vorname", _
    14. .DataType = GetType(String) _
    15. })
    16. Me.table.Columns.Add(New DataColumn() With { _
    17. .ColumnName = "Nachname", _
    18. .DataType = GetType(String) _
    19. })
    20. Me.table.Columns.Add(New DataColumn() With { _
    21. .ColumnName = "Geb.", _
    22. .DataType = GetType(DateTime) _
    23. })
    24. Me.table.Columns.Add(New DataColumn() With { _
    25. .ColumnName = "Größe", _
    26. .DataType = GetType(Double) _
    27. })
    28. Me.table.Columns.Add(New DataColumn() With { _
    29. .ColumnName = "Gewicht", _
    30. .DataType = GetType(Double) _
    31. })
    32. End Sub
    33. Public Sub ReadAllEntries()
    34. Dim appPath As String = "c:\Temp\Beispiel.txt"
    35. Dim fileEntries As New List(Of String)
    36. If Not File.Exists(appPath) Then
    37. MessageBox.Show("Die ausgewählte Datei gibt es nicht.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    38. Exit Sub
    39. End If
    40. Try
    41. ' Alles in eine Liste bringen:
    42. fileEntries.Clear()
    43. fileEntries.AddRange(IO.File.ReadLines(appPath))
    44. fileEntries.RemoveAt(0)
    45. fileEntries.RemoveAt(0)
    46. Catch ex As Exception
    47. ' Die Datei ist leer:
    48. MessageBox.Show("Die ausgewählte Datei ist leer.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    49. Return
    50. End Try
    51. Dim provider As CultureInfo = CultureInfo.InvariantCulture
    52. For Each line As String In fileEntries
    53. Dim parts() As String = line.Split(CChar(vbTab))
    54. Dim newRow As DataRow = Me.table.NewRow()
    55. newRow(0) = parts(0)
    56. newRow(1) = parts(1)
    57. newRow(2) = DateTime.ParseExact(parts(2), "dd.MM.yyyy", provider)
    58. If parts.Length > 3 AndAlso Not String.IsNullOrEmpty(parts(3).Trim) Then
    59. newRow(3) = Double.Parse(parts(3))
    60. End If
    61. If parts.Length > 4 AndAlso Not String.IsNullOrEmpty(parts(4).Trim) Then
    62. newRow(4) = Double.Parse(parts(4))
    63. End If
    64. Me.table.Rows.Add(newRow)
    65. Next
    66. Me.DataGridView1.DataSource = Me.table
    67. End Sub
    68. 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!
    @RodFromGermany
    Aber wie kann man den "Header" formatieren (Breite), wenn ich die Daten via DataTable während der Ausführung des Programms lade?

    Denn bisher habe ich die Daten immer nur via row.add() hinzugefügt, so konnte ich den Spalten (Colums) einen Namen geben und so die Breite beim closing-event abfragen und beim start-event wieder zuweisen.
    Die Column Namen kommen aus der DataTable. Dort gibst du denen doch bereits einen Namen.

    Marv schrieb:

    (...)und so die Breite beim closing-event abfragen und beim start-event wieder zuweisen.

    Was bedeutet das?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Mit folgendem Code leider nicht (mehr) :( :

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. InitDataTable()
    3. DataGridView1.Columns(0).Width = My.Settings.Spalte0_breite
    4. DataGridView1.Columns(1).Width = My.Settings.Spalte1_breite
    5. DataGridView1.Columns(2).Width = My.Settings.Spalte2_breite
    6. DataGridView1.Columns(3).Width = My.Settings.Spalte3_breite
    7. DataGridView1.Columns(4).Width = My.Settings.Spalte4_breite


    VB.NET-Quellcode

    1. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    2. My.Settings.Spalte0_breite = DataGridView1.Columns(0).Width
    3. My.Settings.Spalte1_breite = DataGridView1.Columns(1).Width
    4. My.Settings.Spalte2_breite = DataGridView1.Columns(2).Width
    5. My.Settings.Spalte3_breite = DataGridView1.Columns(3).Width
    6. My.Settings.Spalte4_breite = DataGridView1.Columns(4).Width
    7. My.Settings.Save()
    Welchen Datentyp hat My.Settings.Spalte0_breite?

    Mach das mal aus dem LoadEvent raus in eine separate Methode. VisualStudio zeigt teils Fehler die im Load passieren nicht an.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Marv schrieb:

    wie kann man den "Header" formatieren (Breite)
    Vielleicht überlässt Du das dem System. Mit diesem Wert: Me.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells denke ich hast Du die beste Optik.
    Bilder
    • AutoSize.jpg

      46,29 kB, 334×520, 100 mal angesehen
    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!

    mrMo schrieb:

    Welchen Datentyp hat My.Settings.Spalte0_breite?

    Datentyp ist "Integer"

    Danke für die vielen Vorschläge!
    Ich habe die Größenzuweisung nun in einen separaten Sub gepackt, welcher erst ausgeführt wird wenn die DataSouce dem DataGridView zugewiesen wurde.
    Dies scheint das Problem gelöst zu haben.
    @Marv ich schließe mich dem @ErfinderDesRades an und rate dir dringend dich mit dem Debuggen zu beschäftigen. Hab hierzu 2 Links in der Signatur, die ich dir ans Herz legen möchte :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen