2013-03-09 73 views
1

我想讀取文件,其中每個文件包含一個人的詳細信息,如下所示,並將其轉換爲Person對象。反序列化名稱=值格式的字符串到對象

隱蔽下面

id=1 
firstName=John 
lastName=Smith 

要:

public class Person 
{ 

    public int Id {get;set;} 
    public string FirstName{get;set;} 
    public string LastName{get;set;} 

} 

是否有.NET內置的方法來做到這一點,或第三方庫。我無法通過谷歌找到它。

更新:

文件格式不能更改。

+3

您是否考慮過使用更標準的數據交換格式,如JSON,SEN或XML? – 2013-03-09 14:59:03

回答

3

.NET真的變成了XML,所以你不會發現類INI格式的內置功能。但是有一些庫使得讀取和寫入這些文件變得容易,例如, ini-parsernini,但您仍然必須手動執行與對象的映射。

+0

謝謝! ini和nini之間哪個更成熟? – Pingpong 2013-03-09 18:14:01

+0

尼尼是更廣泛和可以更成熟,但ini分析器是非常簡單易用。兩個庫中的一些基本操作(如讀取文件和保存文件)幾乎完全相同。 – cara 2013-03-09 18:32:26

-1

如果你有這樣的格式的數據:

<Person> 
<Id>1</Id> 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
</Person> 

那麼這個C#代碼desrialise成Person實例

//assuming you have a string called "data" that contains the above XML. 
XDocument xd=XDocument.Parse(data); //needs System.Xml.Linq for XDocument type. 
using(var reader = xd.CreateReader()) 
{ 
    using(XmlSerializer ser = new XmlSerializer(typeof(Person)) 
    { 
     Person p = ser.Deserialize(reader) as Person; 
     //p will be null if it didn't work, so make sure to check it! 
    } 
} 

注意,解串器是大小寫敏感的,所以你需要以確保元素案例與你的類中的屬性框架相匹配(你可以通過使用Serializer屬性裝飾你的屬性來告訴序列化者如何映射他們的屬性here

純原生序列化器非常適合這樣的簡單對象,但可能會讓你在char,bool等數據類型上出現問題,因此請檢查該屬性上的鏈接。

如果你想從你在問題中提供的格式來完成它,你需要編寫一個自定義的串行器,在你的情況下,我的建議是從你的文件中讀取數據並使用XDocument這有助於。

+0

如果downvoters可以指出他們對答案的看法是錯誤的,那麼會很好... – 2016-03-01 10:54:45

+0

提問者明確指出該格式不是且不能是XML。 – Paul 2017-09-07 20:29:30

0

我真的認爲你應該考慮改變你的輸入數據格式到更標準的東西(比如XML或JSON)。

但這並不意味着你根本無法讀取你的文件。你應該僅僅通過自己的閱讀文本文件:

var people = new List<Person>(); 
using (var stream = File.OpenRead("Input.txt")) 
{ 
    using (var reader = new StreamReader(stream)) 
    { 

     while (!reader.EndOfStream) 
     { 
      int id = int.Parse(reader.ReadLine().Substring(3)); 
      string firstName = reader.ReadLine().Substring(10); 
      string lastName = reader.ReadLine().Substring(9); 

      var newPerson = new Person() 
      { 
       Id = id, 
       FirstName = firstName, 
       LastName = lastName 
      }; 

      people.Add(newPerson); 
     } 
    } 
} 
1

例如使用File.ReadAllLines,LINQ的一點點和String.Substring

var lines = File.ReadAllLines(path).Select(l => l.Trim()); 
var idLine = lines.FirstOrDefault(l => l.StartsWith("id=", StringComparison.OrdinalIgnoreCase)); 
var lNameLine = lines.FirstOrDefault(l => l.StartsWith("lastname=", StringComparison.OrdinalIgnoreCase)); 
var fNameLine = lines.FirstOrDefault(l => l.StartsWith("firstname=", StringComparison.OrdinalIgnoreCase)); 
if (idLine != null && lNameLine != null && fNameLine != null) 
{ 
    Person person = new Person() 
    { 
     Id = int.Parse(idLine.Substring(idLine.IndexOf("=") + 1)), 
     FirstName = fNameLine.Substring(fNameLine.IndexOf("=") + 1), 
     LastName = lNameLine.Substring(lNameLine.IndexOf("=") + 1) 
    }; 
} 

(假設有每個文件只是一個人)

但我會使用像XML不同的格式(或課程的數據庫)。

1

您可以用String.Split和LINQ解析文本:

Dictionary<string, string> dict = text 
    .Split(new[] { Environment.NewLine }, StringSplitOptions.None) 
    .Select(e => e.Split('=')) 
    .ToDictionary(strings => strings[0], strings => strings[1]); 

然後使用類似Dictionary Adapter

相關問題