none
Zeilenweises Lesen einer Textdatei (Visual basic) und in Variablen speichern RRS feed

  • Frage

  • Hallo,

    wie kann ich eine Textdatei zeilenweise lesen und jede Zeile in einer Variable speichern?

    Es sollte so sein:

    Wert1 = Zeile1

    Wert2 = Zeile2

    Wert3 = Zeile3

    usw.

    Wert1...3 ist meine Variable und Zeile1...3 ist Zeile Nummer...

    Die Werte in den Zeilen sind Zahlen und müssen auch in der Variable eine Zahl sein.

    Danke.

    Gruß Klaus



    Samstag, 9. August 2014 11:03

Antworten

  • Hallo Klaus,

    Du solltest keine 738 Zilliarden Variablen erstellen, sondern bspw. eine List( Of ... ) oder ein Array verwenden.

    Wenn deine Werte Strings sind, wäre das dann bspw. eine List( Of String )

    Dim Werte As List( Of String )
        Werte = File.ReadAllLines( "<Pfad>" ).ToList()

    In Werte( 0 ) steht dann der Inhalt der ersten Zeile, in Werte( 1 ) der Wert der zweiten Zeile usw. (Index ist nullbasiert, daher rechnet man hier immer Nummer des gewünschten Elements - 1.

    BTW: Was woillst Du eigentlich mit dem Stream und dem Aufruf von Seek, ...? Deine Anforderung ist doch: Lies die Datei. Und dazu hatte ich dir vor ein oder zwei Tagen geschrieben, was Du brauchst. Seek und BaseStream war da sicher nicht dabei. Gibt es noch andere Anforderungen, die hier nicht ersichtlich sind oder warum schreibst Du das so umständlich?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Samstag, 9. August 2014 13:04
    Moderator

Alle Antworten

  • Am 09.08.2014 schrieb BlauesBlatt:

    ich habe ein Problem mit dem auslesen.

    http://support.microsoft.com/kb/302309/de
    http://www.it-visions.de/lserver/codesampledetails.aspx?c=2801

    Es sollte so sein:

    Wert1 = Zeile1

    Wert2 = Zeile2

    Wert3 = Zeile3

    usw.

    Wert1...3 ist meine Variable und Zeile1...3 ist Zeile Nummer...

    Und was hast Du bisher denn schon geschafft?


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Samstag, 9. August 2014 11:12
  • Am 09.08.2014 schrieb BlauesBlatt:

    Und was hast Du bisher denn schon geschafft?

    --

    Die Textdatei zu schreiben...

    Dan solltest Du den Rest mit den beiden geposteten Links ja auch
    hinkriegen.


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Samstag, 9. August 2014 12:27
  • Hallo,
    hat die Datei denn eine feste Anzahl von Zeilen, sodass du exakt weist wie viele Variablen du deklarieren musst? Wenn das nämlich nicht der Fall ist, dann solltest du ein Dictionary(Of Key, Value) o.ä. verwenden um die einzelnen Werte abzuspeichern.

    Um dir aber näher helfen zu können solltest du deinen bisherigen Code zeigen und auch den exakten Aufbau der Textdatei schildern (mit Beispiel).


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 9. August 2014 12:32
    Moderator
  • Hallo Tom,

    die Anzahl der Zeilen ist immer gleich.

    If File.Exists(path) = False Then
                ' Create a file to write to.
                Using sw As StreamWriter = File.CreateText(path)
                    sw.WriteLine("" & wert1 & "")
                    sw.WriteLine("" & wert2 & "")
                    sw.WriteLine("" & wert3 & "")
                    sw.WriteLine("" & wert4 & "")
                    sw.WriteLine("" & wert5 & "")
                    sw.WriteLine("" & wert6 & "")
                    sw.WriteLine("" & wert7 & "")
                    sw.WriteLine("" & wert8 & "")
                    sw.WriteLine("" & wert9 & "")
                    sw.WriteLine("" & wert10 & "")
                    sw.WriteLine("" & wert11 & "")
                    sw.WriteLine("" & wert12 & "")
                    sw.WriteLine("" & wert13 & "")
                    sw.WriteLine("" & wert14 & "")
                    sw.Flush()
                End Using
            Else
                Dim fs As FileStream = New FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)
                ' --- Stream öffnen
                Dim r As StreamReader = New StreamReader(fs)
                ' --- Zeiger auf den Anfang
                r.BaseStream.Seek(0, SeekOrigin.Begin)
                ' --- Alle Zeilen lesen und an Console ausgeben
                wert1 = (r.ReadLine())
                MsgBox("wert1  " & wert1)
                r.BaseStream.Seek(2, SeekOrigin.Begin)
                ' --- Alle Zeilen lesen und an Console ausgeben
                wert2 = (r.ReadLine())
                MsgBox("wert2  " & wert2)
    
    
                ' --- Reader und Stream schließen
                r.Close()
                fs.Close()
            End If

    Die erste Zeile auslesen geht so.

    Aber wie komme ich auf die zweite Zeile?

    Danke.

    Gruß Klaus

    Samstag, 9. August 2014 12:59
  • Hallo Klaus,

    Du solltest keine 738 Zilliarden Variablen erstellen, sondern bspw. eine List( Of ... ) oder ein Array verwenden.

    Wenn deine Werte Strings sind, wäre das dann bspw. eine List( Of String )

    Dim Werte As List( Of String )
        Werte = File.ReadAllLines( "<Pfad>" ).ToList()

    In Werte( 0 ) steht dann der Inhalt der ersten Zeile, in Werte( 1 ) der Wert der zweiten Zeile usw. (Index ist nullbasiert, daher rechnet man hier immer Nummer des gewünschten Elements - 1.

    BTW: Was woillst Du eigentlich mit dem Stream und dem Aufruf von Seek, ...? Deine Anforderung ist doch: Lies die Datei. Und dazu hatte ich dir vor ein oder zwei Tagen geschrieben, was Du brauchst. Seek und BaseStream war da sicher nicht dabei. Gibt es noch andere Anforderungen, die hier nicht ersichtlich sind oder warum schreibst Du das so umständlich?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Samstag, 9. August 2014 13:04
    Moderator
  • BTW: Was woillst Du eigentlich mit dem Stream und dem Aufruf von Seek, ...? Deine Anforderung ist doch: Lies die Datei. Und dazu hatte ich dir vor ein oder zwei Tagen geschrieben, was Du brauchst. Seek und BaseStream war da sicher nicht dabei. Gibt es noch andere Anforderungen, die hier nicht ersichtlich sind oder warum schreibst Du das so umständlich?


    Hallo Stefan,

    wenn man sich nicht auskennt, versucht man es mit jedem Codebeispiel das man findet.

    Stream und Seek ist von Winfried (oben).

    "Dan solltest Du den Rest mit den beiden geposteten Links ja auch
    hinkriegen."

    Danke.

    Gruß Klaus

    Samstag, 9. August 2014 13:31
  • Danke Stefan!

    Das geht einfach und schnell.

    Gruß Klaus

    Samstag, 9. August 2014 13:50
  • Hallo Klaus,

    sorry, den Link hatte ich übersehen. Und klar, wenn man nicht genau weiß, was man verwenden soll, nimmt man ggfs. auch solch ein Beispiel als Vorlage.

    Aber das verlinkte Codebeispiel ist hoffnungslos veraltet (bis einschließlich .NET 1.1 gab es ReadAllLines, ... noch nicht, da mag man das so gemacht haben, seit .NET 2.0, also seit ca. 9 Jahren). Wenn da alle Codebeispiele so aussehen bzw. veraltet sein sollten, würde ich wohl eher andere Quellen zu Rate ziehen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 9. August 2014 22:34
    Moderator
  • Am 10.08.2014 schrieb Stefan Falz [MVP]:

    Aber das verlinkte Codebeispiel ist hoffnungslos veraltet (bis einschließlich .NET 1.1 gab es ReadAllLines, ... noch nicht, da mag man das so gemacht haben, seit .NET 2.0, also seit ca. 9 Jahren). Wenn da alle Codebeispiele so aussehen bzw. veraltet sein sollten, würde ich wohl eher andere Quellen zu Rate ziehen.

    Sorry für das posten von uralten Beispielen. Der KB-Artikel ist für
    .Net 2.0 und es wird auch schon mit einem TextArray gearbeitet. In
    deinem geposteten Beispiel-Code ist das ja ähnlich.
    Ohne jetzt beide Beispiele an einem lebenden Objekt ausprobiert zu
    haben, kannst Du mit einfach Worten erklären was der Unterschied
    zwischen deinem Beispiel und dem Code aus dem KB-Artikel ist?

    Wo genau in den Tiefen des MSDN finde ich denn solch ein
    Code-Beispiel, wie Du es gepostet hast? Für Anfänger oder
    Hobby-Programmierer ist es nicht einfach etwas vollständigere
    Code-Beispiele in den Seite von MSDN zu finden.


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Sonntag, 10. August 2014 08:23
  • Hallo Winfried,

    in der MSDN findet man mit Allgemeine E/A-Aufgaben eine Einführung in die Basis-Operationen.

    Mein persönlicher Favorit fürs Lesen wäre (ab .NET 4.0) die File.ReadLines-Methode. Die belegt im Gegensatz zu den All-Methoden keine großen Speicherblöcke, was bei größeren Dateien zum Problem werden kann. Außerdem lässt sie sich sich gut mit LINQ kombinieren, da sie ein IEnumerable liefert.

    Wobei grundsätzlich die älteren Varianten weiter funktionieren und genauso "richtig" sind; i. a. erfordern sie nur etwas mehr Kodierungsaufwand.

    Die später (ab .NET 2.0 und später) eingeführten "Komfort"-Methoden, vor allem in der File Klasse basieren im Kern auf den Basis-Methoden. Sie decken nur die häufigsten Aufgabenstellungen ab, so dass man wissen sollte, wie die Basisklassen funktionieren, wenn man mehr braucht.

    P. S.: Arbeitet man sich im Inhaltsverzeichnis weiter rauf, findet man Einführung zu beinahe allen .NET Themen. Die Artikel sind oft als "Weitere Ressourcen" in der Dokumentation der jeweiligen Klassen / Methoden verlinkt.

    Eine "aufgehübschte" leichtgewichtige Übersicht (in englisch) findet man unter http://www.dotnetperls.com/file-vbnet

    P.P.S.: Beispiele, die man bei IT-Visions findet, sind IMO häufig schlampig konzipiert - bei einem renommierten Buchautor sollte das nicht vorkommen, ist bedauerlicherweise aber der Fall.

    Gruß Elmar

    Sonntag, 10. August 2014 15:13
    Beantworter
  • Am 10.08.2014 schrieb Elmar Boye [MVP]:
    Hallo Elmar,

    P. S.: Arbeitet man sich im Inhaltsverzeichnis weiter rauf, findet man Einführung zu beinahe allen .NET Themen. Die Artikel sind oft als "Weitere Ressourcen" in der Dokumentation der jeweiligen Klassen / Methoden verlinkt.

    Eine "aufgehübschte" leichtgewichtige Übersicht (in englisch) findet man unterhttp://www.dotnetperls.com/file-vbnet

    vielen Dank für die Links und die Erklärungen. Da hab ich noch
    ordentlich was zu tun. ;)

    P.P.S.: Beispiele, die man bei IT-Visions findet, sind IMO häufig schlampig konzipiert - bei einem renommierten Buchautor sollte das nicht vorkommen, ist bedauerlicherweise aber der Fall.

    Für mich selbst suche ich viel bei stackoverflow und bei vb-paradise.
    Der Artikel von von IT-Visions war unter den ersten den Google
    ausgeworfen hat, und da ich etwas in Eile war hab ich ihn gepostet.


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Sonntag, 10. August 2014 15:49