Textdatei zeilenweise einlesen + in array speichern

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Textdatei zeilenweise einlesen + in array speichern

    Hallo,
    ich habe eine Textdatei nach folgendem Muster:

    U_28.06.2013##29.06.2013##Ja##V3##

    Hier von gibt es mehrer Zeilen, die eingelesen und gespeichert werden sollen, jedoch brauche ich immer die einzelnen Einträge mit "##" getrennt.
    Dazu müsste man doch Split() nehmen!?

    Nun dachte ich es mir so, dass ich die Einträge in ein Array einliest; Ansatz:

    VB.NET-Quellcode

    1. Dim zeilen As Byte = System.IO.File.ReadAllLines(My.Settings.Pfad).Count
    2. Dim spalten As Byte = 4
    3. Dim SArray(0 To zeilen, 0 To spalten) As String


    Problem: wie bekomme ich die Einträge so in das Array?

    Zeile 0 (bzw. 1):
    SArray(0,1) = U_28.06.2013
    SArray(0,2) = 29.06.2013
    SArray(0,3) = Ja
    SArray(0,4) = V3

    Gruß Ludwig
    Du brauchst hier keine Mehrdimensionalen Arrays. Bilde Deine Daten in einer Klasse ab und speichere Instanzen dieser Klassen in einer Liste.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _listData As New List(Of DataClass)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. 'Hier natürlich Daten aus Datei einlesen und jede Zeile durchgehen.
    5. Dim s As String = "U_28.06.2013##29.06.2013##Ja##V3##"
    6. _listData.Add(New DataClass(s))
    7. End Sub
    8. End Class
    9. Public Class DataClass
    10. Public Property Data1 As String
    11. Public Property Data2 As Date
    12. Public Property Data3 As String
    13. Public Property data4 As String
    14. Public Sub New(line As String)
    15. ParseLine(line)
    16. End Sub
    17. Private Sub ParseLine(line As String)
    18. Dim data() As String = line.Split(New String() {"##"}, StringSplitOptions.RemoveEmptyEntries)
    19. Me.Data1 = data(0)
    20. Me.Data2 = Date.Parse(data(1))
    21. Me.Data3 = data(2)
    22. Me.data4 = data(3)
    23. End Sub
    24. End Class


    Hier ein Beispiel. Die Namen der Properties sagen nix aus, da ich nicht weiß, was die Daten aus Deiner Textdatei darstellen sollen. Soll Dir auch nur das Prinzip aufweisen. Die Liste, die nun Deine Daten hält kannst Du nach Belieben abfragen, sortieren usw.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Vielen Dank SpaceyX, dein Code funktioniert.

    Nur habe ich bis jetzt noch nie selbst Klassen erstellt und ich würde gerne mich ein bisschen in das Thema einlesen, denn Copy & Paste bringt ja nicht viel.
    Kennt jemand einen gutes Turorial bzw. einen guten Link, wo das Thema für einen Anfänger verständlich erklärt ist?


    Ich würde grade bei diesem Problem zu "Jagged Arrays" tendieren. Einfach mal hier im MSDN gucken und sonst das Verfahren von Cane anwenden ;)
    @Zakath: Vielen Dank, jetzt habe ich gelernt was "Jagged Arrays" sind... :)


    Vielen Dank
    Ludwig
    Welches Thema meinst Du speziell? Listen oder Klassendesign? Im Allgemeinen wird hier alles gut erklärt.

    microsoft.com/germany/msdn/akt…005dasentwicklerbuch.mspx

    Arbeite Dich durch die Kapitel, die Dich interessieren. Darauf aufbauend kannst Dir ja dann etwas zielgerichtete Bücher zulegen. Aber für die Grundlagen ist das verlinkte Buch zu empfehlen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    Welches Thema meinst Du speziell? Listen oder Klassendesign? Im Allgemeinen wird hier alles gut erklärt.

    Sicherlich ist es nicht schlecht, in beide Themen einen Einblick zu bekommen.
    Ich werde mich bei Gelgenheit durch die Kapitel arbeiten...

    EDIT: es wird ebenfalls das Entwicklerhandbuch für 2010 bereitgestellt, vllt sollte ich das lesen..

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

    Eine Frage noch: Wie komme ich jetzt an die Daten in den Listen ran?

    Beispiel:
    Ich möchte alle Einträge in Data2, also alle Einträge im Format "Datum", überprüfen ob sie in der Vergangenheit oder Zukunft liegen.


    Gruß Ludwig
    Ich weiß nicht, ob es das ist, was du suchst, aber die Daten einzeln verarbeiten könntest du etwa so:

    VB.NET-Quellcode

    1. For Each d as DataClass in _listdata
    2. 'hier jetzt die Zugriffe zum Beispiel:
    3. If d.Data2 < DateTime.Now Then
    4. 'Vergangenheit
    5. Else
    6. 'Zukunft
    7. End If
    8. Next


    Du solltest überlegen, ob du die Daten Typen nicht noch anpassen willst (Hierzu auch Option Strict On). Also Datum nicht als String sondern als DateTime. ggf auch die Typen der properties anpassen ;)

    Gruß Christian

    P.S. Eventuelle Schnitzer im Code bitte ich zu vereihen, da ich eigentlich nur noch c# code und das letzte mal vb echt lange her ist. .. ;)

    Edit: Ups, übersehen, dass SpaceyX die DataClass schon von den Typen richtig hergerichtet hatte... Denn teil kannst du also überspringen

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

    Du kannst die Daten der Liste über ihren Index ansprechen. Oder per ForEach. Diese Liste ist typisiert, dies bedeutet, dass nur Klassen vom selben Typ (Vererbung und Interfaces jetzt mal ausgeschlossen), darin Platz finden. Um zu prüfen, ob das Datum in der Vergangenheit liegt, würde ich der Klasse eine Property verpassen. Ausserdem korrigiere ich mich selber, und ersetze den Datentyp Date durch DateTime.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _listData As New List(Of DataClass)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. 'Hier natürlich Daten aus Datei einlesen und jede Zeile durchgehen.
    5. Dim s As String = "U_28.06.2013##29.06.2013##Ja##V3##"
    6. _listData.Add(New DataClass(s))
    7. End Sub
    8. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    9. MessageBox.Show(_listData(0).IsInPast.ToString())
    10. End Sub
    11. End Class
    12. Public Class DataClass
    13. Public Property Data1 As String
    14. Public Property Data2 As DateTime
    15. Public Property Data3 As String
    16. Public Property data4 As String
    17. Public ReadOnly Property IsInPast As Boolean
    18. Get
    19. 'Gibt -1 zurück, wenn Datum kleiner als heute
    20. 'Gibt 0 zurück, wenn Datum gleich heute
    21. 'Gibt 1 zurück, wenn Datum größer heute
    22. Return Data2.Date.CompareTo(DateTime.Now.Date) < 0
    23. End Get
    24. End Property
    25. Public Sub New(line As String)
    26. ParseLine(line)
    27. End Sub
    28. Private Sub ParseLine(line As String)
    29. Dim data() As String = line.Split(New String() {"##"}, StringSplitOptions.RemoveEmptyEntries)
    30. Me.Data1 = data(0)
    31. Me.Data2 = DateTime.Parse(data(1))
    32. Me.Data3 = data(2)
    33. Me.data4 = data(3)
    34. End Sub
    35. End Class


    Eine Zugriffsbeispiel findest Du in der Button2_Click-Prozedur und die Klasse wurde auch entsprechend angepasst.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    VB.NET-Quellcode

    1. Public Class DataClass
    @LudwigM: Ein solcher Dateiinhalt schreit eigentlich nach einer DataTable, dort kannst Du Dir im Designer Spalten anlegen wie Du sie brauchst und ordentlich damit arbeiten.
    Die komplette DataTable kannst Du mit DataTable1.WriteXml(PFAD) bzw. DataTable1.ReadXml(PFAD) als Datei handeln, da brauchst Du ein altes Format nicht länger.
    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!
    Spoiler anzeigen

    RodFromGermany schrieb:

    Ein solcher Dateiinhalt schreit eigentlich nach einer DataTable, dort kannst Du Dir im Designer Spalten anlegen wie Du sie brauchst und ordentlich damit arbeiten.
    Die komplette DataTable kannst Du mit DataTable1.WriteXml(PFAD) bzw. DataTable1.ReadXml(PFAD) als Datei handeln, da brauchst Du ein altes Format nicht länger.

    Also ein Dataset?

    Denn müsste ich aber wieder viel ändern (z.B. Laden und speichern derListview)....
    Wie könnte man die einzelnen Einträge in die Listview laden, jeweils in eine Zeile? Ansonsten nehme ich ein DGV.

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

    LudwigM schrieb:

    Also ein Dataset?
    Jein. Eine DataTable ist eine Tabelle, die in einem DataSet angesiedelt sein kann. Eine solche kannst Du per DataBinding an ein DataGridView binden.
    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!
    Sag mal genau, was Du mit diesen Daten überhaupt anstellen willst. Und evtl. erklärst Du uns auch, was die Daten genau darstellen sollen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    U_28.06.2013##29.06.2013##Ja##V3##

    Name als Sting##Ausgansdatum als Datum##Ja oder Nein##(Bemerkung)##


    Es soll von dem Datum aus (2. Eintrag), wenn der 3. Eintrag der Zeile 'Ja' ist, auf verschiedene Tage hochgerechnet werden (Termin1: +10 Tage, Termin2: + 12 Tage,...) und überprüft werden ob einer diese Tage heute [wenn möglich auch noch morgen, aber können wir erstmal außen vor lassen] ist.
    Dann soll in der Form ausgegeben welche Termine heute sind, mit dem Namen (1. Eintrag) und der Bemerkung.

    Ist das überhaupt möglich, oder viel zu kompliziert?



    Vielen Dank
    Ludwig
    Zu kompliziert gibt es nicht, da man alles, sei es auch noch so verworren, in kleine Teilaufgaben runterbrechen kann.

    Also verstehe ich es, auf Deinen Beispiel-String bezogen, richtig, dass hier auf den 29.6.2013 10 Tage draufgerechnet werden sollen?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o