Benutzer mit den meisten Antworten
Zeilenweises Lesen einer Textdatei (Visual basic) und in Variablen speichern

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
- Bearbeitet BlauesBlatt Samstag, 9. August 2014 12:20
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
- Bearbeitet Stefan FalzModerator Samstag, 9. August 2014 13:05
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Samstag, 9. August 2014 14:06
- Als Antwort markiert BlauesBlatt Samstag, 9. August 2014 16:24
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=2801Es 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 -
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 -
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 -
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
-
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
- Bearbeitet Stefan FalzModerator Samstag, 9. August 2014 13:05
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Samstag, 9. August 2014 14:06
- Als Antwort markiert BlauesBlatt Samstag, 9. August 2014 16:24
-
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
-
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 -
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 -
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
-
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-vbnetvielen 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