2013-03-09 4 views
1

Я хочу прочитать файлы, каждая из которых содержит данные человека, как показано ниже, и преобразует их в объект Person.Deserialize string name = value format to object

Скрытые ниже

id=1 
firstName=John 
lastName=Smith 

To:

public class Person 
{ 

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

} 

Есть ли .NET встроенные методы, чтобы сделать это, или библиотеку третьей стороны. Я не могу найти его через Google.

Update:

Формат файла не может быть изменен.

+3

Считаете ли вы использование более стандартного формата обмена данными, такого как JSON, SEN или XML? –

ответ

3

.NET действительно в XML, поэтому вы не найдете встроенных функций для INI-подобных форматов. Но есть множество библиотек, которые облегчают чтение и запись таких файлов, например. ini-parser или nini, но вам все равно придется выполнять сопоставление с объектами и из них вручную.

+0

Спасибо! Какой из них более зрелый между инни и нини? – Pingpong

+0

nini гораздо более обширна и более зрелая, но ini-parser очень проста и проста в использовании. Некоторые основные операции, такие как чтение из файла и сохранение файла, почти идентичны в обеих библиотеках. – cara

-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 и т. Д., Так что проверьте, что ссылка на атрибуты.

Если вы хотите сделать это из формата, который вы задали в вопросе, вам нужно будет написать собственный сериализатор, в вашем случае мой совет будет состоять в том, чтобы читать из вашего файла и генерировать XML из данных, используя XDocument Надежда что помогает.

+0

Было бы неплохо, если бы downvoters могли указать, что они считают неправильным в ответе ... –

+0

Ответчик ясно указал, что формат не является и не может быть XML. – Paul

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.