2012-01-18 36 views
6

Tôi muốn biết nếu nó có thể đọc từ một text file một cách nhanh hơn và thông minh hơn.Làm thế nào để đọc từ một tập tin văn bản nhanh hơn/thông minh hơn?

Đây là một định dạng đặc trưng của dữ liệu của tôi trong một text file:

gọi đây là "một phần":

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: 

tôi có hàng ngàn chúng trong một file văn bản.

Có thể sử dụng LINQ để đọc "phần" theo "phần" không? Tôi không muốn lặp qua từng dòng.

Sẽ có thể cho LINQ để bắt đầu tại ID:1; và kết thúc tại ENDCARD:?

Lý do cho điều này là tôi muốn tạo ra một object cho mỗi "phần" ...

Tôi có một cái gì đó như thế này trong tâm trí:

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) 
{ 
} 

Trả lời

12

Ở đây bạn đi:

Điều này có nghĩa là: tạo một khối lặp (một máy trạng thái đọc và "thu được" dữ liệu khi nó được lặp lại; nó không đọc toàn bộ tệp trong một lần) quét các dòng; nếu nó là kết thúc của một thẻ, thẻ là "mang lại"; nếu không, nó sẽ thêm dữ liệu vào từ điển để lưu trữ.

Lưu ý: nếu bạn có số class đại diện cho dữ liệu, thì bạn có thể sử dụng thứ gì đó như phản chiếu hoặc FastMember để đặt giá trị theo tên.

Điều này không sử dụng LINQ trực tiếp; Tuy nhiên, nó được thực hiện như một chuỗi đếm được, đó là khối xây dựng của LINQ-to-Đối tượng, vì vậy bạn có thể tiêu thụ này với LINQ, ví dụ:

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

Wow, đó là thực sự tuyệt vời. Cảm ơn Marc. =) – Willem

+0

Tôi chỉ tự hỏi làm thế nào bạn có thể tìm thấy, đọc và trả lời câu hỏi này trong vòng 10 (okay với chỉnh sửa 15) phút với một câu trả lời rõ ràng và súc tích. – Oliver

+0

@Oliver lịch sự khi đã thực hiện rất nhiều LINQ? –

Các vấn đề liên quan