Zeilenweise aus Textdatei lesen und Splitten

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

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

    Zeilenweise aus Textdatei lesen und Splitten

    Hi Leute,

    Habe in einem aktuellen Projekt einige Informationen hard-coded in einem Array.
    Nun soll das ganze zentral in eine txt ausgelagert werden.

    Das hard-coded Array sieht so aus:

    Quellcode

    1. Dim default_location_list() As Location = {
    2. New Location("Berlin", "BER", "asdfasdf"),
    3. New Location("Karlsruhe", "KA", "asdfasfdasdf")
    4. }


    Die Infos in der Textdatei sollen so aussehen:

    Quellcode

    1. Berlin,BER,asdfasdf
    2. Karlsruhe,KA,asdfasdf


    Habe bisher sowas probiert:

    Quellcode

    1. Dim objReader As New System.IO.StreamReader("C:\locations.txt")
    2. Dim sLine As String
    3. Dim counter As Integer = 0
    4. Dim dummy() As String
    5. Do
    6. sLine = objReader.ReadLine()
    7. If Not sLine Is Nothing Then
    8. dummy = Split(sLine, ",")
    9. default_location_list(counter) = New Location(dummy(0), dummy(1), dummy(2))
    10. counter = counter + 1
    11. End If
    12. Loop Until sLine Is Nothing
    13. objReader.Close()


    Womit das OutlookAddin aber gar nicht mehr in Outlook angezeigt wird.

    Fals jmd eine Idee hat immer her damit ;) Verzeiht mir kleine Fehler, hab erst seit 1-2 Tagen mit Visual Basic zutun.

    Gruß
    @frucht Mach mal den Rahmen so:

    VB.NET-Quellcode

    1. For Each line in IO.File.ReadLine("DEIN_PFAD")
    2. ' line verarbeiten
    3. Next
    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!
    Hi,

    machs doch einfach so:

    VB.NET-Quellcode

    1. Dim lines() As String = System.IO.File.ReadAllLines("DEIN_PFAD")
    2. For Each line In lines
    3. Dim parts() As String = line.Split(";"c)
    4. 'mit parts() machen was du möchtest
    5. Next


    Wichtige Info: ReadAllLines liest die ganze Datei und ReadLine nur immer eine Zeile

    EDIT: zu langsam :)

    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Schonmal vielen Dank!

    Problem ist, dass ich am Ende ein Array brauche was die Locations beinhaltet. Der Konstruktor von Location benötigt die 3 Werte, welche jeweils in einer Zeile in der Textdatei stehen.

    Was ist hier falsch? Wenn ich über diese Funktion default_locations_list die Werte zuweise, wird in Outlook das Addin nicht angezeigt. Wird das default_locations_list hard-coded funktioniert alles :/

    Quellcode

    1. ​Public Function locations_auslesen() As Location()
    2. Dim lines() As String = System.IO.File.ReadAllLines("c:/locations.txt")
    3. Dim result_list() As Location = {}
    4. Dim counter As Integer = 0
    5. For Each line In lines
    6. Dim parts() As String = line.Split(",")
    7. result_list(counter) = New Location(parts(0), parts(1), parts(2))
    8. counter = counter + 1
    9. Next
    10. locations_auslesen = result_list
    11. End Function

    frucht schrieb:

    VB.NET-Quellcode

    1. Dim result_list As New List(Of Location)
    Das muss aus der Prozedur in die Klasse.
    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!

    frucht schrieb:

    return
    OK, das ist die alte Syntax, wo dem Prozedur-namen der Return-value zugewiesen wird.
    Mach trotzdem eine List(Of T) draus.
    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!

    frucht schrieb:

    das
    nicht, eher das Array, wo Du nicht weißt, wieviele Elemente da rein sollen. Deswegen List(Of T).
    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!
    mit so ner List(of T) ist es übersichtlicher und einfacher...habs selbst vor einigen Wochen gelernt ;) ...es ist nicht schwer...aber man hat damit mehr Möglichkeiten, als mit nem Array...schmeiß dein Array weg und mach dir so ne Liste...

    frucht schrieb:

    Array
    Zum Erstellen nimmst Du eine List(Of T) und Du returnst MyList.ToArray. :thumbsup:
    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!
    man kann auch ein Array zurückgeben, und das geht am einfachsten unter Verwendung der Linq-Extensions.
    Problem ist, du kennst dich damit noch nicht aus, und wirsts daher nicht verstehen.

    Alternativ kannst du doch erstmal eine List(Of Location) befüllen (wie dir hier nun schon paarmal empfohen wurde) und als Rückgabe die einfach mit der .ToArray()-Extension in ein Array wandeln

    VB.NET-Quellcode

    1. dim myLocationList As new list(Of Location)
    2. '...
    3. return myLocationList.Toarray

    Quellcode

    1. Public Function locations_auslesen() As Location()
    2. Dim lines() As String = System.IO.File.ReadAllLines("C:\locations.txt")
    3. Dim myLocationList As New List(Of Location)
    4. Dim counter As Integer = 0
    5. For Each line In lines
    6. Dim parts() As String = line.Split(",")
    7. myLocationList(counter) = New Location(parts(0), parts(1), parts(2))
    8. counter = counter + 1
    9. Next
    10. Return myLocationList.ToArray


    Selber Fehler (Addin erscheint nicht mehr in Outlook)

    Wenn ich z.B. ne Sub definiere und einfach default_location_list(0) ein neues Objekt zuweise funktioniert es. Waaaaarum will das nicht mit der txt?

    frucht schrieb:

    VB.NET-Quellcode

    1. myLocationList(counter) = New Location(parts(0), parts(1), parts(2))
    Mach da dies draus:

    VB.NET-Quellcode

    1. myLocationList.Add(New Location(parts(0), parts(1), parts(2)))
    setz einen Haltepunkt drauf und vervolge den Inhalt der Variablen.
    Die Variable counter brauchst Du nicht.
    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!
    ja, das problem steht in deim ersten Post, und ist völlig unverständlich.
    weil wir haben keine Ahnung, was dieser Code mit deinem Outlook zu tun hat.

    Später sagtest du, dein Problem sei, ein Array zurückzugeben - was man besser verstehen kann - und das ist jetzt gelöst.
    Okey, dann tuts mir Leid - hier nochmal ;).

    Ich habe ein Projekt übernommen, welches ein OutlookAddin darstellt.
    Daher habe ich logischerweise eine größere Codebasis und bräuchte eben als return ein Array, da das hard-coded Array sehr oft verwendet wird.
    Das ist mittlerweile aber ja nicht mehr das Problem, da es ja dieses ToArray() gibt.

    Nun erhalte ich mit dieser zusätzlichen Methode in Outlook einen Fehler bzw. das Addin erscheint nicht. Daraus schließe ich, dass an der Methode an sich was nicht funktioniert.

    Hoffe das ist nun einigermaßen verständlich

    EDIT: Sowas funktioniert z.B. auch:

    Quellcode

    1. Public Sub location_aendern()
    2. Dim MyLocationList As New List(Of Location)
    3. For Each Location In default_location_list
    4. MyLocationList.Add(Location)
    5. Next
    6. default_location_list = myLocationList.ToArray
    7. End Sub


    Dann müsste es ja eigentlich irgendwo beim Splitten bzw. Auslesen hapern?

    EDITEDIT:

    Quellcode

    1. Public Sub location_aendern()
    2. Dim splitted() As String
    3. Dim test As String
    4. Dim FILE_NAME As String = "c:\locations.txt"
    5. Dim objReader As New System.IO.StreamReader(FILE_NAME)
    6. test = objReader.ReadLine
    7. splitted = Split(test, ",")
    8. default_location_list(0) = New Location(splitted(0), splitted(1), splitted(2))
    9. objReader.Close()
    10. End Sub


    Sogar das hier funktioniert. Dann müsste es irgendwo an der Schleife liegen?
    Gruß

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

    Einen

    frucht schrieb:

    VB.NET-Quellcode

    1. StreamReader
    brauchst Du nicht, nimm ReadLine
    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 hier wurde dir eiglich nu oft genug ans Herz gelegt:

    VB.NET-Quellcode

    1. Public Function locations_auslesen() As Location()
    2. Dim lines() As String = System.IO.File.ReadAllLines("C:\locations.txt")
    3. Dim myLocationList As New List(Of Location)
    4. For Each line In lines
    5. Dim parts() As String = line.Split(","c)
    6. myLocationList.add(New Location(parts(0), parts(1), parts(2)))
    7. Next
    8. Return myLocationList.ToArray
    9. End Function
    Und das funktioniert.
    Deine anneren Outlook-Probleme liegen an etwas annerem, also da kannst du dich jetzt noch Jahre mit dieser Funktion beschäftigen - es wird die Outlook-Probleme nicht lösen.