2008-11-12 13 views
7

Mein Projekt benötigt eine Datei, in der ich Schlüssel/Wert-Paar-Daten speichern werde, die vom Benutzer gelesen und geändert werden können. Ich möchte, dass das Programm nur erwartet, dass die Schlüssel da sind, und ich möchte sie so schnell wie möglich aus der Datei analysieren.Einfachste Schlüssel/Wert-Paar-Dateianalyse in .NET

Ich könnte sie in XML speichern, aber XML ist viel zu komplex, und es würde erfordern, Knoten, Kindknoten und so weiter, alles, was ich will, ist eine Klasse, die eine Datei und generiert Schlüsselwert-Paare. Ich möchte so wenig Fehler wie möglich behandeln, und ich möchte es mit so wenig Code wie möglich getan.

Ich könnte eine Klasse wie diese selbst programmieren, aber ich würde lieber lernen, wie es im Rahmen ist, als das Rad zweimal zu erfinden. Gibt es in .NET (3.5) einige eingebaute magische Klassen, die dazu in der Lage sind?

MagicClass kv = new MagicClass("Settings.ini"); // It doesn't neccesarily have to be an INI file, it can be any simple key/value pair format. 
string Value1 = kv.get("Key1"); 
... 
+0

Als @Nicholas Mancuso wies darauf hin, XML-Serialisierung erfordern NICHT Knoten durchlaufen, usw. – user7116

Antwort

6

Verwenden Sie die KeyValuePair Klasse für Sie Schlüssel und Wert, dann nur eine List auf die Festplatte mit einem serialisieren.

Das wäre der einfachste Ansatz, den ich fühle. Sie müssen sich keine Gedanken über das Durchqueren von Knoten machen. Der Aufruf der Deserialize-Funktion erledigt das für Sie. Der Benutzer könnte die Werte in der Datei auch bearbeiten, wenn sie dies wünschen.

+0

Man muss berücksichtigen, dass 'KeyValuePair' nicht serialisierbar ist. Eine detailliertere Beschreibung der Lösung wird in dieser Folgefrage diskutiert: http://stackoverflow.com/questions/2658916/serializing-a-list-of-key-value-pairs-to-xml – Slauma

+0

Wäre es möglich? ein praktisches Beispiel geben? –

6

Ich kenne keine eingebaute Klasse, um ini-Datei zu analysieren. Ich habe nini verwendet, wenn dies erforderlich ist. Es ist lizenziert unter der MIT/X11-Lizenz und hat daher kein Problem, in ein geschlossenes Quellprogramm aufgenommen zu werden.

Es ist sehr zu verwenden. Also, wenn Sie eine Settings.ini Datei auf diese Weise formatiert:

[Configuration] 
Name = Jb Evain 
Phone = +330101010101 

Verwendung wäre es so einfach sein wie:

var source = new IniConfigSource ("Settings.ini"); 
var config = source.Configs ["Configuration"]; 

string name = config.Get ("Name"); 
string phone = config.Get ("Phone"); 
+0

Nützliche. Hier ist das Git (Hub) Repo https://github.com/bmatzelle/nini –

0

Format die Datei auf diese Weise:

key1=value1 
key2=value2 

lesen ganze Datei in eine Zeichenfolge (es gibt eine einfache Funktion, die dies tut, vielleicht in der Datei oder String-Klasse), und rufen Sie string.Split ('='). Stellen Sie sicher, dass Sie auch string.Trim() für jede Taste und jeden Wert aufrufen, während Sie die Liste durchlaufen und jedes Paar in eine Hashtabelle oder ein Wörterbuch einfügen.

2

, wenn der Benutzer möchte in der Lage sein, die Datei zu lesen und ändern, schlage ich eine durch Kommas getrennte Paar, eine pro Zeile

key1,value1 
key2,value2 
... 

Parsing ist einfach: Lesen Sie die Datei, Split bei Newline oder Komma nehmen, dann die Elemente paarweise

+0

Es kann auch das Format einer Java-Eigenschaftendatei entsprechen und anstelle von Komma equals verwenden. – JeeBee

+0

@JeeBee: aber das würde annehmen, dass der Benutzer mit einem Java-Eigenschaftendateiformat vertraut wäre; Ein CSV-Format kann mit Excel oder Notepad bearbeitet werden –

5

Wenn Sie für eine schnelle einfache Funktion freuen und wollen nicht .Net App \ user Konfigurationseinstellungsdateien oder Sorgen über die Serialisierung Probleme verwenden, die manchmal von Zeit auftreten.

Die folgende statische Funktion kann eine Datei wie „Schlüssel = Wert“ formatiert laden.

public static Dictionary<String, String> LoadConfig(string settingfile) 
    { 
     var dic = new Dictionary<String, String>(); 

     if (File.Exists(settingfile)) 
     { 
      var settingdata = File.ReadAllLines(settingfile); 
      for (var i = 0; i < settingdata.Length; i++) 
      { 
       var setting = settingdata[i]; 
       var sidx = setting.IndexOf("="); 
       if (sidx >= 0) 
       { 
        var skey = setting.Substring(0, sidx); 
        var svalue = setting.Substring(sidx+1); 
        if (!dic.ContainsKey(skey)) 
        { 
         dic.Add(skey, svalue); 
        } 
       } 
      } 
     } 

     return dic; 
    } 

Anmerkung: Ich bin mit einem Wörterbuch so Schlüssel eindeutig sein muss, die mit der Einstellung in der Regel, dass Fall ist.

ANWENDUNG:

var settingfile = AssemblyDirectory + "\\mycustom.setting"; 
    var settingdata = LoadConfig(settingfile); 
    if (settingdata.ContainsKey("lastrundate")) 
    { 
     DateTime lout; 
     String svalue; 
     if (settingdata.TryGetValue("lastrundate", out svalue)) 
     { 
      DateTime.TryParse(svalue, out lout); 
      lastrun = lout; 
     } 
    } 
Verwandte Themen