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 内置方法可以做到这一点,或者第三方库。我无法通过谷歌找到它。

更新:

文件格式不能更改。

4

5 回答 5

3

.NET 真正融入了 XML,因此您不会找到类似 INI 格式的内置功能。但是有很多库可以很容易地读取和写入这样的文件,例如ini-parsernini,但是您仍然必须手动执行与对象的映射。

于 2013-03-09T15:10:54.913 回答
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(当然也可以是数据库)。

于 2013-03-09T15:12:13.600 回答
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 之类的东西。

于 2013-03-09T15:13:21.070 回答
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);
        }
    }
}
于 2013-03-09T15:11:10.427 回答
-1

如果您的数据格式如下:

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

然后这个 C# 代码将反序列化为 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!
    }
}

请注意,反序列化器区分大小写,因此您需要确保元素大小写与类中属性的大小写匹配(您可以通过使用告诉序列化器如何在此处映射它们的序列化器属性装饰您的属性来解决此问题)

普通的原生序列化器非常适合像这样的简单对象,但可能会在某些数据类型上绊倒你,比如 char、bool 等,所以请检查属性上的链接。

如果您想按照问题中提供的格式执行此操作,则需要编写一个自定义序列化程序,在您的情况下,我的建议是从您的文件中读取并使用XDocument从数据中生成 XML希望有帮助。

于 2013-03-09T15:06:32.883 回答