2013-03-09 70 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

相关问题