2011-12-20 23 views
6

Vì vậy, tôi đang tạo ra một danh sách các dòng trong một file văn bản như thế này:Bắt hai hàng cuối cùng trong một tập tin văn bản

var lines = File.ReadAllLines("C:\\FileToSearch.txt") 
       .Where(x => !x.EndsWith("999999999999")); 

và Looping qua đường như thế này

foreach (var line in lines) 
{ 
    if (lineCounter == 1) 
    { 
     outputResults.Add(oData.ToCanadianFormatFileHeader()); 
    } 
    else if (lineCounter == 2) 
    { 
     outputResults.Add(oData.ToCanadianFormatBatchHeader()); 
    } 
    else 
    { 
     oData.FromUsLineFormat(line); 
     outputResults.Add(oData.ToCanadianLineFormat()); 

    } 
    lineCounter = lineCounter + 1; 
    textBuilder += (line + "<br>"); 
} 

Tương tự như tôi truy cập vào hai hàng đầu tiên tôi muốn truy cập hàng cuối cùng và dòng thứ hai riêng lẻ

+0

Tôi đã đề xuất chỉnh sửa thêm thẻ C# vào thẻ này. Đó là một câu hỏi về xử lý tập tin văn bản bằng cách sử dụng C# - asp.net không thực sự đi vào phương trình. – jadarnel27

Trả lời

11

Tại đây bạn có thể tận dụng LINQ một lần nữa:

var numberOfLinesToTake = 2; 
var lastTwoLines = lines 
    .Skip(Math.Max(0, lines.Count() - numberOfLinesToTake)) 
    .Take(numberOfLinesToTake); 

var secondToLastLine = lastTwoLines.First(); 
var lastLine = lastTwoLines.Last(); 

Hoặc, nếu bạn muốn lấy chúng riêng lẻ:

var lastLine = lines.Last(); 
var secondToLastLine = 
    lines.Skip(Math.Max(0, lines.Count() - 2)).Take(1).First(); 

tôi thêm .First() đến cùng, vì .Take(1) sẽ trả về một mảng chứa một mục, mà chúng tôi sau đó lấy bằng First(). Điều này có thể được tối ưu hóa.

Một lần nữa, bạn có thể muốn làm quen với LINQ vì đôi khi nó là một trình tiết kiệm thời gian thực.

+1

Chỉ cần ra khỏi tò mò, là '.Take()' thực sự cần thiết ở đây? Liệu '.Skip()' có trả về mọi thứ nhưng hai anwyay cuối cùng? –

+0

@KileyNaro yes '.Skip()' sẽ trả lại mọi thứ cần thiết. Tôi đã thêm '.Take()' để làm cho khái niệm rõ ràng hơn. Trong ví dụ thứ hai của tôi, '.Take (1)' chắc chắn là bắt buộc. –

0

Đây là một trong những vấn đề khi sử dụng var khi không phù hợp.

ReadAllLines trả về một mảng các chuỗi: string []

Bạn có thể lấy chiều dài của mảng và chỉ số ngược từ cuối.

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