2012-01-18 27 views
6

我想知道是否有可能以更快更智能的方式從text file中讀取。如何從文本文件讀取更快/更智能?

這是我的數據在text file的典型格式:

稱之爲「部分」:

ID:1; 
FIELD1 :someText; 
FIELD2 :someText; 
FIELD3 :someText; 
FIELD4 :someText; 
FIELD5 :someText; 
FIELD6 :someText; 
FIELD7 :someText; 
FIELD8 :someText; 
END_ID : 
01: someData; 
02: someData; 
... 
... 
48: someData; 
ENDCARD: 

我有成千上萬的人在一個文本文件中。

是否可以使用LINQ通過「零件」來讀取它的「零件」?我不想循環每一行。

LINQ有可能在ID:1;開始並在ENDCARD:結束?

這樣做的原因是,我希望爲每一個「部」 object ...

我腦子裏想的是這樣的:

string[] lines = System.IO.File.ReadAllLines(SomeFilePath); 

//Cleaning up the text file of unwanted text 
var cleanedUpLines = from line in lines 
        where !line.StartsWith("FIELD1") 
        && !line.StartsWith("FIELD5") 
        && !line.StartsWith("FIELD8") 
        select line.Split(':'); 

//Here i want to LINQtoText "part" by "part" 

//This i do not want to do!!! 
foreach (string[] line in cleanedUpLines) 
{ 
} 

回答

12

在這裏你去:

static void Main() 
{ 
    foreach(var part in ReadParts("Raw.txt")) 
    { // all the fields for the part are available; I'm just showing 
     // one of them for illustration 
     Console.WriteLine(part["ID"]); 
    } 
} 

static IEnumerable<IDictionary<string,string>> ReadParts(string path) 
{ 
    using(var reader = File.OpenText(path)) 
    { 
     var current = new Dictionary<string, string>(); 
     string line; 
     while((line = reader.ReadLine()) != null) 
     { 
      if(string.IsNullOrWhiteSpace(line)) continue; 
      if(line.StartsWith("ENDCARD:")) 
      { 
       yield return current; 
       current = new Dictionary<string, string>(); 
      } else 
      { 
       var parts = line.Split(':'); 
       current[parts[0].Trim()] = parts[1].Trim().TrimEnd(';'); 
      } 
     } 
     if (current.Count > 0) yield return current; 
    } 
} 

這是做什麼的:創建一個迭代器塊(一個狀態機讀取和「產生」數據,因爲它是迭代的;它不會一次讀取整個文件)掃描行;如果它是一張卡的結尾,則該卡被「取消」;否則它會將數據添加到字典中進行存儲。

注意:如果您有自己的class表示數據,那麼您可以使用反射或FastMember之類的內容來按名稱設置值。

這不直接使用LINQ;但是,它的實現可枚舉序列,這是LINQ到對象的構建塊,所以你可以消耗這與LINQ,即

var data = ReadParts("some.file").Skip(2).First(x => x["ID"] == "123"); 
+0

哇,這真的真棒。謝謝馬克。 =) – Willem 2012-01-18 08:23:19

+0

我只是想知道如何找到,閱讀和回答這個問題10(編輯15分鐘)與這樣一個乾淨簡潔的答案。 – Oliver 2012-01-18 08:46:21

+0

@Oliver提供了很多LINQ的幫助? – 2012-01-18 09:19:39

相關問題