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

たとえば、を使用して、Linqと?File.ReadAllLinesを少し使用します。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)
    };
}

(ファイルごとに1人だけであると仮定します)

しかし、私はXML(またはもちろんデータベース)のような別の形式を使用します。

于 2013-03-09T15:12:13.600 に答える
1

String.SplitLINQを使用してテキストを解析できます。

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

次に、DictionaryAdapterのようなものを使用します。

于 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のインスタンスにdesrialiseします

//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などの一部のデータ型につまずく可能性があるため、属性のリンクをチェックアウトしてください。

質問で指定した形式から実行する場合は、カスタムシリアライザーを作成する必要があります。この場合、ファイルから読み取り、XDocumentHopeを使用してデータからXMLを生成することをお勧めします。

于 2013-03-09T15:06:32.883 に答える