Textdatei in Structur einlesen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von bekon.

    Textdatei in Structur einlesen

    Der Umstieg von VB5 macht mir doch mehr Probleme als erwartet :)
    Wie kann ich eine strukturierte Textdatei (Usertabelle) in eine Structur einlesen?

    Um den Gedanken zu verdeutlichen: Ein Versuch seht so aus:
    Public Structure Satz
    Public l1 As Byte ' in Usertabelle binär = länge des Usernamens
    <VBFixedString(50)> Public name As String
    Public l2 As Byte
    <VBFixedString(50)> Public passwort As String
    Public l3 As Byte
    <VBFixedString(254)> Public pfad As String

    End Structure
    '--------------------------------------------

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    FileOpen(1, "G:\....users.usr", OpenMode.Input, , , Convert.ToInt32("1a73", 16))
    'Die Datensatzlänge ist enorm. Aber erstmal die ersten Felder auslesen :)
    Dim Daten As Satz
    Daten = Nothing
    While Not EOF(1)
    InputString(1, Daten.l1)
    InputString(1, Daten.pftpname)
    Input(1, Daten.l2)
    Input(1, Daten.passwort)
    Input(1, Daten.l3)
    Input(1, Daten.pfad)
    TextBox1.Text = Daten.pftpname
    TextBox1.Text &= Daten.passwort
    TextBox1.Text &= Daten.pfad

    End While

    End Sub

    Es gibt keine Fehler, aber die Textbox bleibt leer.
    Wie funktionierts wirklich?
    In .Net sind Sachen wie FileOpen oder Input ein NoGo, schau dir mal FileStream und StreamReader an, richtig angewandt ist damit viel mehr und viel einfacher möglich.
    Setze um den Code auch bitte einen VB-Tag, damit man ihn besser lesen kann.
    Das NoGo ist mir eigentlich klar.
    Der Qellcode soll auch nur meine Gedanken und die Struktur der Textdatei verdeutlichen.
    Mein Hauptproblem ist eigentlich das Einlesen in die Structur satz.
    Hierzu habe ich leider noch nichts hilfsreiches gefunden.

    Bitte um einen Tip, Codeschnipsel, Link, was auch immer weiter hilft.

    Danke
    Das geht leider nicht (Datenschutz)
    Aber theoretisch:

    5bekon............................................9abcdefghij........................................9C:\abcdef....................................... usw.
    wobei . NULL oder zufällig ist.

    1. Byte= tatsächliche Länge des Namens . BYTE!
    2.-50. Byte NAME (nicht benutzte Byte sind Schrott oder NULL)
    51.Byte= Länge Passwort
    52.-102= Passwort
    103. Byte Länge Pfad
    104-154 Pfad
    Bis hier das, was ich (erstmal) lesen möchte. Es folgt jede Menge Müll, dann später am Ende noch vier Felder

    Wegen dem BYTE-Wert sollte ich wohl Binär öffnen.
    sollte ich wohl Binär öffnen.
    Jap.
    Geht auch ganz leicht, erstelle einfach einen FileStream auf die Datei. Dieser besitzt eine Read-Funktion, mit der du eine bestimmte Anzahl Bytes in ein Array einlesen kannst. Du liest also nacheinander die verschiedenen Teile der Datei in ByteArrays ein, und diejenigen Abschnitte, die einen Text darstellen, konvertierst du anschließend mittels System.Encoding in einen String.
    Habe zwar nicht alles verstanden, aber keine Frage mehr.
    Hier EINE Lösungsmöglichkeit. Vlt. nicht optimal (die Tabelle - nicht von mir - ist sehr eigenwillig).
    Habe gerade erfahren, das sich die Struktur demnächst ändert, also alles umsonst und von vorn ;)

    Schön, wenn's jemand anderem hilft:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. 'Form mit Datagridview
    5. Public Structure Satz 'Strukur der zu lesenden Usertabelle
    6. 'Public l1 As Byte 'Länge Username
    7. <VBFixedString(50)> Public Username As String
    8. 'Public l2 As Byte ' änge passwort
    9. <VBFixedString(50)> Public passwort As String
    10. 'Public l3 As Byte 'Länge pfad
    11. <VBFixedString(254)> Public pfad As String
    12. <VBFixedString(15)> Public Geb As String
    13. <VBFixedString(15)> Public Klasse As String
    14. <VBFixedString(15)> Public SchLeh As String
    15. End Structure
    16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    17. Dim path As String = "G:\...\users12.usr"
    18. Dim daten As Satz
    19. Dim L As Integer
    20. 'Dim fInfo As New FileInfo(path)
    21. 'Dim numBytes As Long = fInfo.Length
    22. Dim fs As New FileStream(path, FileMode.Open, FileAccess.Read)
    23. Dim reader As New BinaryReader(fs)
    24. Dim bytes As Byte() '= reader.ReadBytes(CInt(numBytes))
    25. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    26. reader.BaseStream.Position = 0
    27. While True 'Tabelle hat kein eindeutiges End of Data
    28. Try
    29. L = reader.ReadByte() ' tatsächliche Länge des Namns
    30. If L = 0 Then Exit While
    31. bytes = reader.ReadBytes(50) 'Feld Name lesen
    32. daten.Username = enc.GetString(bytes).Substring(0, L) 'Name als String speichern
    33. L = reader.ReadByte()
    34. bytes = reader.ReadBytes(50)
    35. daten.passwort = enc.GetString(bytes).Substring(0, L)
    36. L = reader.ReadByte()
    37. bytes = reader.ReadBytes(254)
    38. daten.pfad = enc.GetString(bytes).Substring(0, L)
    39. ' Müll überspringen:
    40. reader.BaseStream.Position += 6083
    41. L = reader.ReadByte()
    42. bytes = reader.ReadBytes(15)
    43. daten.Geb = enc.GetString(bytes).Substring(0, L)
    44. L = reader.ReadByte()
    45. bytes = reader.ReadBytes(15)
    46. daten.Klasse = enc.GetString(bytes).Substring(0, L)
    47. L = reader.ReadByte()
    48. bytes = reader.ReadBytes(15)
    49. daten.SchLeh = enc.GetString(bytes).Substring(0, L)
    50. ' Rest überspringen:
    51. reader.BaseStream.Position += 284
    52. DataGridView1.Rows.Add(daten.Username, daten.passwort, daten.pfad, daten.Geb, daten.Klasse, daten.SchLeh)
    53. Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
    54. MsgBox("Line " & ex.Message & "is not valid and will be skipped.")
    55. End Try
    56. End While
    57. End Sub

    bekon schrieb:

    Schön, wenn's jemand anderem hilft:
    Kannst Du da auch einen VB.NET-Code draus machen, ohne VB6-Ranz?
    Nimm aus Deinem Projekt mal den VisualBasic-Namespace raus.
    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!
    Wenn die Daten ohnehin als String hinterlegt sind und fast alles wieder in String konvertiert werden muss, wäre es nicht einfacher einen StreamReader zu nehmen und zu splitten?

    Die Werte, die Byte sein sollen, bekommt man ja aus dem ascii Wert.