2008-11-12 26 views
7

Dự án của tôi yêu cầu tệp mà tôi sẽ lưu trữ dữ liệu cặp khóa/giá trị có thể được người dùng đọc và sửa đổi. Tôi muốn chương trình chỉ mong đợi các phím ở đó và tôi muốn phân tích chúng từ tệp càng nhanh càng tốt.Phân tích tệp cặp khóa/giá trị đơn giản nhất có thể trong .NET

Tôi có thể lưu trữ chúng trong XML, nhưng XML là cách phức tạp, và nó sẽ yêu cầu duyệt qua các nút và các nút con và cứ như vậy, tất cả những gì tôi muốn là một số lớp cần tệp và tạo cặp khóa giá trị. Tôi muốn xử lý lỗi ít nhất có thể, và tôi muốn nó được thực hiện với ít mã nhất có thể.

Tôi có thể tự mình viết một lớp như vậy, nhưng tôi muốn tìm hiểu xem nó không phải như thế nào trong khuôn khổ hơn là phát minh ra bánh xe hai lần. Có một số lớp ma thuật được xây dựng trong .NET (3.5) có thể làm như vậy không?

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

Như @Nicholas Mancuso chỉ ra, XML serialization KHÔNG yêu cầu vượt qua nút vv – user7116

Trả lời

6

Sử dụng lớp KeyValuePair cho bạn Khóa và giá trị, sau đó chỉ cần tuần tự hóa List vào đĩa có số XMLSerializer.

Đó sẽ là cách tiếp cận đơn giản nhất mà tôi cảm thấy. Bạn sẽ không phải lo lắng về việc duyệt qua các nút. Gọi chức năng Deserialize sẽ làm điều đó cho bạn. Người dùng có thể chỉnh sửa các giá trị trong tệp nếu họ muốn.

+0

Người ta phải xem xét rằng 'KeyValuePair' không phải là serializable. Mô tả chi tiết hơn về giải pháp ở đây được thảo luận trong câu hỏi tiếp theo này: http://stackoverflow.com/questions/2658916/serializing-a-list-of-key-value-pairs-to-xml – Slauma

+0

Bạn có thể để cung cấp một ví dụ thực tế? –

6

Tôi không biết bất kỳ lớp nội trang nào để phân tích cú pháp tệp ini. Tôi đã sử dụng nini khi cần thiết để làm như vậy. Nó được cấp phép theo giấy phép MIT/X11, do đó, không có bất kỳ vấn đề nào để được đưa vào chương trình nguồn đóng.

Rất dễ sử dụng. Vì vậy, nếu bạn có một tập tin Settings.ini định dạng theo cách này:

[Configuration] 
Name = Jb Evain 
Phone = +330101010101 

Sử dụng nó sẽ là đơn giản như:

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

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

hữu ích. Đây là git (hub) repo https://github.com/bmatzelle/nini –

0

Format file theo cách này:

key1=value1 
key2=value2 

Đọc toàn bộ tập tin vào một chuỗi (có một chức năng thuận tiện đơn giản mà làm điều đó, có thể trong các tập tin hoặc chuỗi lớp), và gọi string.Split ('='). Hãy chắc chắn rằng bạn cũng gọi string.Trim() trên mỗi khóa và giá trị khi bạn duyệt qua danh sách và pop từng cặp vào một hashtable hoặc từ điển.

2

nếu bạn muốn người dùng có thể đọc và chỉnh sửa các tập tin, tôi đề nghị một cặp dấu phẩy phân cách, mỗi dòng một

key1,value1 
key2,value2 
... 

phân tích cú pháp rất đơn giản: đọc các tập tin, chia tại newline hoặc dấu phẩy , sau đó lấy các phần tử theo cặp

+0

Cũng có thể làm cho nó tương đương với định dạng thành tệp thuộc tính Java và sử dụng bằng dấu phẩy thay vì dấu phẩy. – JeeBee

+0

@JeeBee: nhưng điều đó giả định rằng người dùng sẽ quen thuộc với định dạng tệp thuộc tính java; định dạng csv có thể được chỉnh sửa bằng Excel hoặc notepad –

5

Nếu bạn đang tìm kiếm một chức năng dễ dàng nhanh chóng và không muốn sử dụng tệp .Net app \ user config hoặc lo lắng về vấn đề serialization đôi khi xảy ra theo thời gian.

Hàm tĩnh sau có thể tải tệp có định dạng như "KEY = VALUE".

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; 
    } 

Lưu ý: Tôi đang sử dụng từ điển để khóa phải là duy nhất, thường là trường hợp có cài đặt.

SỬ DỤNG:

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; 
     } 
    } 
Các vấn đề liên quan