Hallo!

> da das Auslesen der Datei sehr schnell gehen muss, m�chte ich 
> das �ber einen Stream erledigen und nicht auf eine Datenbank 
> zur�ckgreifen m�ssen.

Hm, ich benutze eine Datenbank, damit es schnell geht. Zumindest ab
einer bestimmten Datenmenge. Kleine Datenmengen sind egal mit welcher
Zugriffsmethode sehr schnell, oder?

> >Nat�rlich g�be es auch einen Workaround.
> >Mit StreamReader.ReadToEnd kannst Du die komplette Datei einlesen und
> >dann die letzte Zeile suchen. Die letzte Zeile bekommst Du dann so:
> >
> >GanzeDatei  = StreamReader.ReadToEnd
> >LetzteZeile =
> >GanzeDatei.Substring(GanzeDatei.LastIndexOf(Environment.NewLine) + 1)
> 
> ich habe etwas mit StreamReader.ReadToEnd rumprobiert; dein 
> .Substring(... - Methode w�rde ich gerne testen. Beim 
> Rausholen der letzten Zeile durch "Envirnment.NewLine" kommt 
> aber nichts raus, da das letzte Zeichen ja eine Zeilenumbruch ist. 
> Ich m�sste auf den vorletzten Zeilenumbruch verweisen; kannst 
> du mir dazu bitte vielleicht einen Tipp geben?

LetzteZeile =
GanzeDatei.Substring(GanzeDatei.LastIndexOf(Environment.NewLine, 1) + 1)

Jetzt startet die LastIndexOf-Methode beim 2. Zeichen von hinten
(Parameter: 1).

> >Wenn Du jedoch mit der FileStream-Klasse arbeitest, kannst 
> Du direkt auf
> >beliebige Positionen in der Datei zugreifen. Daf�r gibt es da die
> >Methode FileStream.Seek(...). Damit kannst Du das Lesen 
> beschleunigen,
> >musst Dich aber um einheitliche Zeilenl�ngen oder andere
> >Positionierungshilfen und auch um das Encoding selber k�mmern.
> 
> Die Zeilenstruktur ist in der Datei immer dieselbe, die 
> Zeilenl�nge jedoch nicht. 
> Ich m�sste in einer 2. Phase die M�glichkeit haben die 
> einzelnen Zeilen zu "durchlaufen" und jene rauszuholen wo an 
> bestimmter Stelle ein bestimmter Wert steht.
> K�nnte da die von dir genannte FileStream.Seek-Methode das 
> passende sein?

Ja und Nein,

Es kommt zun�chst auf die Daten an und dabei, ob Du Unicode-, UTF-8-
oder ASCII-Encoding ben�tigst. In dem Fall w�rde ich die
FileStream-Klasse meiden und die TextStream-Klasse nutzen. Lies dazu mal
das Kapitel �ber IO.Stream in der Dokumentation zum .net Framework.

Um mit FileStream.Seek effektiv arbeiten zu k�nnen, musst Du die
Datenstruktur genau kennen, also auf jeden Fall feste Zeilen- und
Spaltenl�ngen haben. Ansonsten musst Du auch beim Suchen die Daten
komplett einlesen.

Wenn Du die komplette Datenmenge im RAM halten kannst, kannst Du auf
eine Datenbank verzichten und mit den Zeichenketten-Funktionen in der
gesamten Datenmenge suchen. Besser noch Du erzeugst eine Datenstruktur
im Speicher:

Structure meinDatensatz
   Dim Spalte1 As Integer
   Dim Spalte2 As String
   Dim Spalte3 As String
   Dim Spalte4 As Date
   ...
   Dim SpalteN As Boolean
End Structure

Dim meineDaten As new ArrayList()

F�r jede neue Zeile erzeugst Du ein Objekt vom Typ "meinDatensatz" und
f�gst Sie dem ArrayList-Object "meineDaten" mit der Methode .Add hinzu.

F�r das Lesen und das Speichern benutzt Du dann das Serializing von
.NET. Damit kannst Du komplette Objekte in den RAM lesen oder auf die
Festplatte schreiben:

Dim stream As New IO.Stream("...fileName...", IO.FileMode.OpenOrCreate,
IO.FileAccess.Write)
Dim writer As New Xml.XmlTextWriter(stream, System.Text.Encoding.UTF8)
writer.Formatting = Xml.Formatting.Indented
writer.Indentation = 3
Dim serial As New Xml.Serialization.XmlSerializer(GetType(meineDaten))
serial.Serialize(writer, meineDaten)
serial = nothing
writer.Close
stream.Close

Das Einlesen geht genau umgekehrt:

Dim stream As New IO.Stream("...fileName...", IO.FileMode.Open,
IO.FileAccess.Read)
Dim reader As New Xml.XmlTextReader(stream)
Dim serial As New Xml.Serialization.XmlSerializer(GetType(meineDaten))
If serial.CanDeserialize(reader) Then meineDaten =
serial.Deserialize(reader)
serial = nothing
writer.Close
stream.Close

Tja, sieht dann doch nach einer Datenbank aus, oder?

Freundliche Gr��e
Joachim van de Bruck

_______________________________________________
Vb.net mailing list
[EMAIL PROTECTED]
http://www.glengamoi.com/mailman/listinfo/vb.net

Odpovedet emailem