INI-Datei Zeilen manuell auslesen ?!

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von dbsystel.

    INI-Datei Zeilen manuell auslesen ?!

    Hallo,

    ich habe eine INI-Datei und muss diese manuell auslesen, da unter NET. Framework 1 auf WinCE leider kein INI-Datei Support besteht. Zumindest habe ich noch keine Codes dazu gefunden.
    Dementsprechend lese ich Zeile für Zeile aus. Das klappt auch so ganz gut. Nur wie kann ich sagen das die Zeile erst nach dem "=" ausgelsen werden soll.

    Sprich "NAME=MUSTERMANN" (Zeile2), dann soll nur Mustermann raus kommen.

    Mein Code bis jetzt: (Alles im Modul, da von mehreren Forms benutzt!)

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class DSK_INI_READ
    3. Public Shared Benutzer As String
    4. Public Shared Sub DSK_Benutzer()
    5. Dim sr As StreamReader = New StreamReader("SD Card/media.ini")
    6. Dim i As Integer
    7. For i = 1 To 2
    8. Benutzer = sr.ReadLine()
    9. Next
    10. End Sub
    11. End Class


    Jetzt liest er zwar die Zeile 2 aus, wo der Name auch steht, nur leider alles aus der Zeile.
    Wie kann ich jetzt sagen das alles was nach dem "=" kommt ausgelesen wird.

    Gruß und Danke
    Hm ich denke das ist nicht so schön und ein schritt den man sich spaaren kann ;)

    Text.IndexOf("=") gibt einen Integer wert zurück welcher die Stelle des Zeichens "=" zurückgibt.
    len(Text) gibt einen Integer wert zurück welcher die länge des Strings Text zurückgibt.
    Microsoft.VisualBasic.Right(String,Länge) gibt einen String zurück. Dieser wird aus dem String und der Längenangabe "geformt".
    Er fängt rechts in dem String an und läuft nach links bis die angegebene Länge ereicht ist ;)

    Heisst wenn du den String "NAME=MUSTERMANN" hast und als länge 4 angibst kommt "MANN" raus (?? oder "RMANN" weiss gard nicht wie er Zählt)

    Langer Text kurze bedeutung ...

    VB.NET-Quellcode

    1. Microsoft.VisualBasic.Right(Text, Len(Text) - (Text.IndexOf("=")+1))


    Gruß Zim

    PS. Wenn ich was falsches gesagt hab bitte korigieren :whistling:
    Einfacher geht es mit Split

    VB.NET-Quellcode

    1. Dim pfad As String = "c:\temp\test.txt"
    2. For Each zeileKomplett As String In IO.File.ReadAllLines(pfad)
    3. Dim zeileSplit() As String = zeileKomplett.Split("="c)
    4. Select Case zeileSplit.Length
    5. Case Is < 2
    6. Debug.WriteLine(zeileKomplett & " -> Ungültig")
    7. Case Is > 2
    8. Debug.WriteLine(zeileKomplett & " -> Nicht eindeutig!")
    9. Case Else
    10. Debug.WriteLine("Name: " & zeileSplit(0) & " -> Wert: " & zeileSplit(1))
    11. End Select
    12. Next
    Hi
    Split sollte man nur verwenden, wenn man wirklich beide Teile benötigt (wenn überhaupt). Ich würde das so machen:

    VB.NET-Quellcode

    1. Public Shared Function GetValue(ByVal line As String) As String
    2. 'Position eines optionalen Kommentars ermitteln
    3. Dim commentStart As Integer = line.IndexOf(";"c)
    4. 'Position des Anfangs des Wertes ermitteln
    5. Dim valueStart As Integer = line.IndexOf("="c) + 1
    6. 'Ueberpruefen, ob ein Wert vorhanden ist
    7. If valueStart = -1 Then
    8. Throw New ArgumentException("Invalid Ini-file syntax.")
    9. Else
    10. 'Leerzeichen und Tabs ueberspringen
    11. While line(valueStart) = " "c OrElse line(valueStart) = Chr(9)
    12. valueStart += 1
    13. End While
    14. 'Wenn kein Kommentar vorhanden ist, wird die Position des Kommentars auf die Laenge der Line gesetzt
    15. If commentStart = -1 Then
    16. commentStart = line.Length
    17. End If
    18. 'Position des Kommentars so verrutschen, dass Leerzeichen und Tabs hinter dem Wert weggeschnitten werden
    19. While commentStart - 1 > valueStart AndAlso line(commentStart - 1) = " "c OrElse line(commentStart - 1) = Chr(9)
    20. commentStart -= 1
    21. End While
    22. Return line.Substring(valueStart, commentStart - valueStart)
    23. End If
    24. End Function


    Wenn du die Leerzeichen nicht überspringen möchtest, kannst du natürlich die While-Schleifen entfernen. Normalerweise werden die aber übersprungen oder zumindest nicht mit ausgewertet, außer in Sonderfällen (soweit ich weiß).

    Edit: Bitte stell den Code doch als Text ins Forum und nicht als Datei. Wenn man sich den Code ansehen will, muss man sich sonst immer erst eine Datei runterladen und ich denk' mal nicht, dass der Code irgendwie extrem lang ist (sonst könnte man ihn in einen Expander packen).

    Gruß
    ~blaze~
    1. ist er schon lange, ist ja eine eigene classe
    und 2tens, funktioniert das mit dem posten von codes bei mir irgendwie nicht, der macht mir dann aus den vielen zeilen, immer 1ne dauerwurst, weiß nicht was ich da flasch mache

    EDIT// Die Classe hat über 100 zeilen
    aber sie funktioniert dafür echt super, benutze sie selber!!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hmatrix2“ ()

    Hi,

    hmatrix2 schrieb:

    ich hätte ne ganz schöne classe zum schreiben und lesen von ini-dateien

    Die Klasse habe ich auch schon im Internet gefunden. Nur wird unter WinCE leider keine INI-Datei supported. Ist halt CF 1, dort gibts glaube ich noch keine INI Funktion.

    Also mit Split würde ich es eher nicht machen. Da ist mir die Methode mit Replace sicherer und einfacher,da nur ein Zeile Code.

    @~blaze~
    Werd ich nachher mal ausprobieren. Klingt ganz gut. Werde das ganze dann im Modul einpflegen.

    @zim

    VB.NET-Quellcode

    1. Microsoft.VisualBasic.Right(Text, Len(Text) - (Text.IndexOf("=")+1))

    Klingt auch gut, probiere ich auch gleich mal aus!

    Danke erstmal für eure Hilfe.

    Gruß
    dbsystel