Werte aus einer Config datei lesen

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Werte aus einer Config datei lesen

    Hallo,

    das ist mein erster Post hier.

    Ich bin relativ neu in VB, kann aber Grundlagen etc.

    Ich schreibe zurzeit ein kleines Programm, welches Chancen etc ausrechnen soll für das Spiel "World of Tanks". Dafür müsste ich eine Configdatei (.yml? oder .cfg?) erstellen. Diese soll Folgende Werte enthalten:

    Schaden, Durchschlagskraft, Panzerung und Schüsse/Minute

    Ich habe mir die Configdatei so vorgestellt:

    Quellcode

    1. IS3:
    2. Schaden[390]
    3. Durchschlagskraft[225]
    4. Leben[1500]
    5. Panzerung[220]
    6. Schüsse[4.5]
    7. Tiger II:
    8. Schaden[320]
    9. Durchschlagskraft[220]
    10. Leben[1500]
    11. Panzerung[180]
    12. Schüsse[6]


    Die Configdatei soll man nur per Hand, also mit Notepad++ oder so, geändert werden.

    Wie mache ich das nun?

    Ich wäre für jegliche Holfe dankbar!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lukas97“ () aus folgendem Grund: Dummheit

    OK...

    Im Namespace "System.IO" findest Du die File-Klasse. Diese stellt verschiedene Methoden bereit, um was mit Dateien anzustellen.

    Unter Anderem gibt es dort eine Funktion, die alle Zeilen aus einer Datei ausliest. Ich geb Dir mal den MSDN-Link:

    msdn.microsoft.com/de-de/library/system.io.file.aspx
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    OKEY,

    ich fasse mich mal etwas genauer (hätte ich auch früher tun sollen....).....

    Ich habe hier eine Textbox, da gebe ich beispielsweiße den Namen des Panzers ein, also "IS3".

    Dann soll er die Werte aus der Configdatei holen und in einem Label ausgegeben.

    Tut mir Leid, aber vom MSDN verstehe ich nicht viel, ich versuchs zwar mal, aber ich werd nur eines sagen, es wird nicht klappen.... trololololololol
    Ich tendiere ja eher zu mehreren Configdateien, also jede Nation eine.

    Also, Deutschland, Russland (Spiele ich :D), Frankreich, China, England (Großbritannien) und USA.

    Es wären also 6 Dateien, wenn dies überhaupt möglich ist.
    mein Tip:
    lese die Datei aus, speichere die einzelnen Zeilen in einem Array, dann starte "for each line as string in ZEILEN" schleife und dann frage ab ob line ":" beinhaltet, wenn ja ist es eine "Eigenschaftsgruppe" wenn die Zeile "[" behinaltet ist es ein wert in der Gruppe, den wert kannst du auslesen in dem du die Zeile bei "[" splittest und dann im wert 2(index: 1) von dem array "]" mit "" ersetzt ;)

    Hoffe es ist verständlich

    Gruß,
    Julian
    ok^^
    Du hast eine Datei. -> Die lädst du und splittest diese per Split(String, chr(13) & chr(10)) in Zeilen auf, diese Array nennen wir Lines.

    VB.NET-Quellcode

    1. Dim Lines = Split(My.Computer.FileSystem.ReadAllText("Datei", System.Text.Encoding.Default), chr(13) & chr(10))


    so, nun Gehst du Jede zeile ab ob sie einen bestimmten wert enthält:

    VB.NET-Quellcode

    1. Dim Gruppe as String = ""
    2. For Each Line as String in Lines
    3. If(Line.Contains(":")) Then
    4. Gruppe = Replace(Line, ":", "")
    5. End If
    6. If(Line.Contains("["))
    7. Dim Name = Split(Line, "[")(0)
    8. Dim Wert = Replace(Split(Line, "[")(1), "]", "")
    9. End If
    10. Next

    Jetzt hast du eine Schleife die Den Gruppen Namen, Den Wert und Den Namen der Einstellung Abruft;)

    Gruß,
    Julian
    Danke, aber noch 3 Sachen:

    1.

    Sieht irgendwie zeimlich easy aus Oo

    2.

    Fehler bei

    Dim
    Wert = Replace(Split(Line, "["), "]", "")

    Line wird blau unterstrichen und da steht irgendwas, dass das nicht mehr Supported wird. Ich mache das alles mit .NET Framework 3.5

    3.

    Wo muss ich die Configdatei nun hinmachen? Ist das nun eine .txt? Und wie mache ich das nun, dass wenn ich in einer Textbox IS3 schreibe, dass dan diese Daten ausgegeben werden?

    //Edit

    Habe das so:

    VB.NET-Quellcode

    1. Public Class Form3Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Russland.Show()Dim Lines = Split(My.Computer.FileSystem.ReadAllText("Datei", System.Text.Encoding.Default), Chr(13) & Chr(10))
    3. Dim Gruppe As String = ""For Each Line As String In Lines
    4. If (Lines.Contains(":")) ThenGruppe = Replace(Line, ":", "")
    5. End If
    6. If (Lines.Contains("[")) ThenDim Name = Split(Line, "[")(0)
    7. Dim Wert = Replace(Split(Lines, "["), "]", "")
    8. End If
    9. NextEnd Sub
    10. End Class
    So, ist zwar doof jetzt nen ganzen Quelltext zu posten aber ich konnte das besser nicht erklären -.-, habs aber Kommentiert:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim Tanks As New List(Of Tank)
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Dim Lines = Split(My.Computer.FileSystem.ReadAllText("tanks.cfg", System.Text.Encoding.Default), Chr(13) & Chr(10)) ' Lade Datei und teile in Zeilen auf
    6. Dim CurrentTank As Tank = Nothing ' Setze den Aktuellen Tank auf NOTHING
    7. For Each Line As String In Lines ' Frage Jede Zeile Ab
    8. If (Line.Contains(":")) Then ' Wenn die Zeile ein : beinhaltet
    9. If IsNothing(CurrentTank) = False Then ' Frage ab ob der Aktuelle Tank schon fest gelegt wurde
    10. Tanks.Add(CurrentTank) ' Falls Ja füge den Tank zu der Liste hinzu
    11. End If
    12. CurrentTank = New Tank(Replace(Line, ":", "")) ' erstelle einen Neuen Tank
    13. End If
    14. If (Line.Contains("[")) Then ' Wenn die Zeile [ beinhaltet
    15. Dim Name As String = Split(Line, "[")(0) ' Frage den Namen der Eigenschaft ab
    16. Dim Wert As String = Replace(Split(Line, "[")(1), "]", "") ' und den Wert
    17. CurrentTank.Values.Add(New TankValue(Name, Wert)) ' und füge anschließend die eigenschaft dem Tank hinzu
    18. End If
    19. Next ' nächste Zeile
    20. Tanks.Add(CurrentTank) ' Füge den Letzten Tank der Liste hinzu
    21. For Each _Tank As Tank In Tanks ' Frage jeden Tank in der Liste Tanks ab
    22. ListBox1.Items.Add(_Tank.Name) ' Füge der Listbox ein Item mit dem namen des Tanks hinzu
    23. For Each Eigenschaft As TankValue In _Tank.Values ' Frage jede Eigenschaft des Tanks ab
    24. ListBox1.Items.Add(" -" & Eigenschaft.Name & " -> " & Eigenschaft.Value) ' und füge der Listbox die Eigenschaft und den Wert Hinzu
    25. Next
    26. Next
    27. End Sub
    28. End Class
    29. Public Class Tank
    30. ' Tank Variablen
    31. Dim iValues As New List(Of TankValue) ' Liste mit allen Eigenschaften des Tanks
    32. Dim iName As String = "" ' Name des Tanks
    33. ' Neue Tank Sub
    34. Sub New(ByVal Name As String)
    35. iName = Name
    36. End Sub
    37. ' Eigenschaft Tankname
    38. Public Property Name As String
    39. Get
    40. Return iName
    41. End Get
    42. Set(ByVal value As String)
    43. iName = value
    44. End Set
    45. End Property
    46. ' Eigenschaft Tankeigenschaften
    47. Public Property Values As List(Of TankValue)
    48. Get
    49. Return iValues
    50. End Get
    51. Set(ByVal value As List(Of TankValue))
    52. iValues = value
    53. End Set
    54. End Property
    55. End Class
    56. Public Class TankValue
    57. ' Tankeigenschafts Variablen
    58. Dim iName As String = "" ' Name der Tankeigenschaft
    59. Dim iValue As String = "" ' Wert der Tankeigenschaft
    60. ' Neue Tankeigenschaft
    61. Sub New(ByVal Name As String, ByVal Value As String)
    62. iName = Name
    63. iValue = Value
    64. End Sub
    65. ' Name der Tankeigenschaft
    66. Public Property Name As String
    67. Get
    68. Return iName
    69. End Get
    70. Set(ByVal value As String)
    71. iName = value
    72. End Set
    73. End Property
    74. ' Wert der Tankeigenschaft
    75. Public Property Value As String
    76. Get
    77. Return iValue
    78. End Get
    79. Set(ByVal value As String)
    80. iValue = value
    81. End Set
    82. End Property
    83. End Class


    für den Code benötigst du eine Listbox

    Gruß,
    Julian

    Lukas97 schrieb:

    Ich tendiere ja eher zu mehreren Configdateien, also jede Nation eine.

    muß man das so verstehen, dass du die Dateien und das Format selbst definieren kannst?

    Da sollteste von diesem selbstgebastelten Format abstand nehmen, und dir ein typisiertes Dataset basteln. Da kannst du Nationen und Panzer und Atombomben anlegen wie du wolle.

    Deine Überlegungen stellen nämlich eine Datenmodellierung dar, und es scheint Nationen und Panzer zu geben, und du überlegst, wie du die Panzer den Nationen zuordnen kannst.
    Nicht wahr: für sowas ist typisiertes Dataset erfunden worden, und ist die exorbitant bessere Lösung, als viele Dateien anzulegen, das wirst du sehen, wenndedich drauf einläßt.

    Allerdings musste Datenmodellierung erlernen, aber das musste sowieso (du bist ja dabei, das Rad neu zu erfinden)

    gugge die relationale GrundIdee und DB-Programmierung ohne Datenbank
    Vielen dank schonmal für den Code.

    Habe das nun genauso abgetippt, aber es kommt 1 Fehler beim Starten:

    Quellcode

    1. c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.VisualBasic.targets(134,9): error MSB3105: The item "obj\Release\Tool.Form1.resources" was specified more than once in the "Resources" parameter. Duplicate items are not supported by the "Resources" parameter.

    Ich rate mal:
    .NET Framework, falsche version?
    Die Config ist nicht da? (Wo(In welchen Ordner) muss die nun hin?)
    Alternative: Settings-Klasse anlegen, per JSON- oder XMLSerializer speichern und wieder abrufen.

    msdn.microsoft.com/en-us/libra…zation.xmlserializer.aspx
    msdn.microsoft.com/en-us/library/bb412179.aspx
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.