2012-09-05 28 views
1

我有一個包含這樣寫喜歡一個文件:解析獨特的線(使用LINQ)

[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].

如:

[Person]: [Age]-[21], [HairColor]-[Turqoise], [Gender]-[Other].

雖然我熟悉LINQ的,我我在使用Linq解決這個問題時遇到了很多麻煩。

我想能夠只是去了所有行:

[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE]. 

...,做一些與檢索到的每個人。

任何想法?任何幫助都將不勝感激。

+1

你可以指定你想要做什麼? – horgh

+0

對不起,是的。我想將一行的所有屬性/值存入一個對象;併爲文件中的每一行執行此操作。 –

+1

根據您在原始問題中發表的評論意見, >抱歉,是的。我想獲得一行的所有屬性/值到一個對象;併爲文件中的每一行執行此操作。 你想從一個文件解析文本到一個對象。在這種情況下,LINQ不會幫助你,因爲LINQ lamba表達式是對現有對象的操作。 – Magnum

回答

1

下面是一個例子,如果我有你所需要的正確的,當然:

 File.ReadAllLines("Utils.txt") 
      .Select(s => new 
      { 
       Name = s.Substring(1, s.IndexOf("]:") - 1), 
       Values = s.Substring(s.IndexOf(":") + 2) 
          .Split(new string[] { ", " }, StringSplitOptions.RemoveEmptyEntries) 
          .ToDictionary(l => l.Substring(1, l.IndexOf("]-") - 1), 
             l => l.Substring(l.IndexOf("-[") + 2).Trim(']')) 
      }) 
      .ToList() 
      .ForEach(o => 
       { 
        Console.WriteLine(o.Name); 
        o.Values.ToList().ForEach(p => Console.WriteLine(string.Format("\t{0}:\t{1}", p.Key, p.Value))); 
       }); 

所以,在這裏你會得到匿名對象的列表具有兩個屬性:

  1. 名稱只是一個字符串
  2. 值 - 一對鑰匙是您的財產和價值的對字典

在我的例子我通過我讀過一個簡單的循環,在打印到控制檯

測試文件(Utils.txt)的含量爲以下幾點:

[NAME]: [PROPERTY1]-[VALUE1], [PROPERTY2]-[VALUE2], [PROPERTY3]-[VALUE3] 
[Person]: [Age]-[21], [HairColor]-[Turqoise], [Gender]-[Other] 

的輸出:

NAME 
    PROPERTY1: VALUE1 
    PROPERTY2: VALUE2 
    PROPERTY3: VALUE3 
Person 
    Age: 21 
    HairColor: Turqoise 
    Gender: Other 
+1

如果您有一些類(或類),描述保存在這些文本行中的對象,可能會創建強類型的對象,而不是通過反射匿名,並且字典中的必要性將消失 – horgh

+0

非常感謝@Konstantin :) –

+0

@ JTS-V隨時歡迎您 – horgh

1

你不會用LINQ解析它。你可以用正則表達式或類似的東西來解析它,然後使用LINQ來對其進行操作。

例如,使用正則表達式,如:

\[(.*)\]: \[(.*)\]-\[(.*)\], \[(.*)\]-\[(.*)\], \[(.*)\]-\[(.*)\] 

並使用括號的組。

+1

謝謝@ akton! –

+1

@ JTS-V歡迎您。 – akton

1

LINQ解析:

string input = "[Person]: [Age]-[21], [HairColor]-[Turqoise], [Gender]-[Other]."; 
var output = input.Split(new[] {':', '-', ','}, StringSplitOptions.RemoveEmptyEntries) 
    .Select(s => s.Trim('[', ']', ' ', '.')).ToList(); 

var name = output.First(); 
var properties = output.Skip(1).ToList(); 

var propertyDic = Enumerable.Range(0, properties.Count()/2) 
         .ToDictionary(i => properties.ElementAt(2*i), 
             i => properties.ElementAt(2*i + 1));