Bestimmte zeilen aus INI Datei

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Bestimmte zeilen aus INI Datei

    Hallo Zusammen

    ich bin gerade am verzweifeln.

    ich habe eine INI Datei in dieser art

    [section1]
    maeh1=a|b|d

    [section2]
    wert1=a|b|d
    wert2=a|b|d
    wert3=a|b|d
    wert4=a|b|d

    [section3]
    blub1=a|b|d

    jetzt möchte ich jeweils die letzten 3 werte aus der section2 auslesen. Die Section kann mehr oder weniger einträge enthalten.



    hab es mit Split probiert bisher, ist aber denke ich mal der falsche ansatz =(

    wer kann Helfen und Tipps geben?

    Danke schon mal

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

    paq schrieb:

    hab es mit Split probiert
    N bisken wenig Info. Daher von meiner Seite ein paar Stichpunkte:
    • mit IO.File.ReadAllLines alle Zeilen in ein Array oder eine List(Of String) einlesen
    • alle Zeilen durchgehen, bis Du zur Zeile "[section2]" kommst
    • danach bis zur zur nächsten Leerzeile alle Zeilen in eine neue List(Of String) einlesen
    • dann hast Du Deine Daten aus Sektion 31 (ach nee, das war was anderes) section2 und dann damit machen, was Du willst
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @paq Fang an mit

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll", SetLastError:=True)> _
    2. Private Shared Function GetPrivateProfileSection(ByVal lpAppName As String, _
    3. ByVal lpReturnedString As IntPtr, _
    4. ByVal nSize As Integer, _
    5. ByVal lpFileName As String) As Integer
    Frag mal Frau Google nach Beispielen dafür.
    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!
    Mach mal eine google suche nach site:pinvoke.net GetPrivateProfileSection.

    Auf dieser Seite findest du so einige WinApi Funktionen mit .net Deklaration, sehr oft ist auch ein Beispiel dabei.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @paq hast dir den Ansatz von @VaporiZed mal angeschaut? Das wäre ne recht simple Lösung.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Die Items in der Auflistung lassen sich per Index ansprechen.

    Dim i as Integer = 1234
    Dim lst as New List( Of String)
    Dim s As String = lst(i)
    Der Index ist Nullbasierend
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Jast du denn dein Problem nun lösen können? Falls ja, lass ins doch daran Teil haben. Jemand der irgendwann ein ähnliches Problem hat wird sich bestimmt freuen hier eine Lösung zu finden.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich habe mir das jetzt auch mal angetan, @RodFromGermany dabei bin ich auf diese Funktionen gestossen, die sind hier auch ganz nützlich.
    GetPrivateProfileString
    GetPrivateProfileInt

    Immerhin wollte der TE ja die Werte, nicht die KeyNames + Wert. <Edit>oder doch die Zeile? nicht ganz eindeutig.</Edit>

    Hier das was ich erarbeitet hab, die ini datei liegt neben der exe, da ich einen Pfad relativ angebe.
    "app.ini"

    [section1]
    maeh1=a|b|d

    [section2]
    wert1=a|b|d
    wert2=a|b|d
    wert3=a|b|d
    wert4=1

    [section3]
    blub1=a|b|d

    "Code"

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Public Class Form1
    4. <DllImport("kernel32.dll", SetLastError:=True)>
    5. Private Shared Function GetPrivateProfileSection(ByVal lpAppName As String, ByVal lpReturnedString As IntPtr, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    6. End Function
    7. <DllImport("kernel32.dll", SetLastError:=True)>
    8. Private Shared Function GetPrivateProfileString(ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As StringBuilder, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    9. End Function
    10. <DllImport("kernel32.dll", SetLastError:=True)>
    11. Public Shared Function GetPrivateProfileInt(ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Integer, ByVal lpFileName As String) As Integer
    12. End Function
    13. <DllImport("kernel32.dll")>
    14. Public Shared Function GetLastError() As UInteger
    15. End Function
    16. Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    17. A()
    18. B()
    19. C()
    20. End Sub
    21. Sub A()
    22. Dim strPointer As IntPtr = Marshal.StringToHGlobalAnsi(New String(Nothing, 1024))
    23. Dim length As Integer = GetPrivateProfileSection("section2", strPointer, 1024, ".\app.ini")
    24. Dim buffer As String = Marshal.PtrToStringAnsi(strPointer, length)
    25. Marshal.FreeHGlobal(strPointer)
    26. Dim sb As New StringBuilder(1024)
    27. If length = 0 Then
    28. MessageBox.Show(GetLastError.ToString())
    29. Else
    30. For i As Integer = 0 To length - 1
    31. If buffer(i) = Nothing Then
    32. MessageBox.Show(sb.ToString())
    33. sb = New StringBuilder(1024)
    34. Else
    35. sb.Append(buffer(i))
    36. End If
    37. Next
    38. End If
    39. End Sub
    40. Sub B()
    41. Dim sb = New StringBuilder(1024)
    42. Dim length As Integer = GetPrivateProfileString("section3", "blub1", "", sb, sb.Capacity, ".\app.ini")
    43. If length = 0 Then
    44. MessageBox.Show(GetLastError.ToString())
    45. Else
    46. MessageBox.Show(sb.ToString())
    47. End If
    48. End Sub
    49. Sub C()
    50. Dim wert4 As Integer = GetPrivateProfileInt("section2", "wert4", 0, ".\app.ini")
    51. MessageBox.Show(wert4.ToString())
    52. End Sub
    53. End Class


    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „NoIde“ ()

    NoIde schrieb:

    GetPrivateProfileString
    GetPrivateProfileInt
    Die Kenntnis dieser Funktionen habe ich vorausgesetzt. ;)
    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!