2012-02-09 46 views
5

Tôi có một tệp chứa một số lượng hàng cố định nhất định có một số số. Tôi cần phải đọc từng hàng để có được số đó và xử lý chúng và ghi vào một tập tin. Vì tôi cần phải đọc từng hàng, vì số lượng hàng tăng lên, nó sẽ mất thời gian.Cách đọc tập tin hiệu quả nhất

Có cách hiệu quả để đọc từng hàng của tệp không? Tôi đang sử dụng C#.

+4

Thuộc vào StackOverflow. –

+0

Bạn có đang sử dụng 4.0 hoặc 2/3.5 không? –

Trả lời

0

Đọc tất cả các hàng từ một tệp luôn ít nhất là O (n). Khi kích thước tập tin bắt đầu trở thành một vấn đề thì đó có thể là thời điểm tốt để xem xét việc tạo một cơ sở dữ liệu cho thông tin thay vì các tệp phẳng.

+0

cũng các tập tin là kết quả của một phần cứng bên ngoài mà sẽ ở dạng tập tin và thực sự là một số lượng lớn các tập tin .... bất kỳ cách nào hiệu quả đọc các tập tin sẽ được đánh giá cao – Jay

14

File.ReadLines (.NET 4.0+) có lẽ là cách hiệu quả nhất để thực hiện việc này.

Nó trả về một IEnumerable<string> có nghĩa là các dòng sẽ được đọc một cách lười biếng theo kiểu truyền trực tuyến.

Phiên bản trước không có tùy chọn phát trực tuyến có sẵn theo cách này, nhưng việc sử dụng StreamReader để đọc từng dòng sẽ đạt được điều tương tự.

+1

Điều này chỉ có sẵn trong .NET 4 hoặc lớn hơn. Chỉ cần một cái gì đó để chỉ ra, không chắc chắn những gì OP đang sử dụng. –

+0

@AaronMcIver - Điểm tốt. Đã cập nhật câu trả lời. – Oded

+0

Tôi đã khá chắc chắn tôi đã sử dụng điều này trong 3.5 có thể là File.ReadAllText mà trả về một String Array – Venki

0

Không chắc đây là hiệu quả nhất, nhưng nó hoạt động tốt đối với tôi: http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

//Declare a new file and give it the path to your file 
    FileInfo fi1 = new FileInfo(path); 

    //Open the file and read the text 
    using (StreamReader sr = fi1.OpenText()) 
    { 
     string s = ""; 
     // Loop through each line 
     while ((s = sr.ReadLine()) != null) 
     { 
      //Here is where you handle your row in the file 
      Console.WriteLine(s); 
     } 
    } 
+0

Những gì tôi làm sau này, thay vì chỉ viết dòng vào giao diện điều khiển, là chuyển đổi dòng vào một mảng và nhập dữ liệu vào một bảng cơ sở dữ liệu. Dường như chạy rất nhanh thông qua các tập tin phân cách tab nhưng tôi hầu như không bao giờ phải đi qua hơn một vài nghìn hồ sơ với nó. –

+0

Trừ khi bạn đang làm một cái gì đó đặc biệt với StreamReader, mà trong ví dụ này bạn không, bạn chỉ có thể viết 'foreach (dòng var trong File.ReadLines (đường dẫn)) {Console.WriteLine (line); } '. – Philip

0

Không có vấn đề mà hệ điều hành bạn đang sử dụng, sẽ có một vài lớp giữa mã của bạn và lưu trữ thực tế cơ chế. Ổ đĩa cứng và ổ băng lưu trữ các tệp trong các khối, mà những ngày này thường là khoảng 4K mỗi. Nếu bạn muốn đọc một byte, thiết bị sẽ vẫn đọc toàn bộ khối vào bộ nhớ - nó chỉ nhanh hơn theo cách đó. Thiết bị và hệ điều hành cũng có thể giữ một bộ nhớ cache của các khối. Vì vậy, bạn không thể làm gì để thay đổi hành vi đọc tập tin tiêu chuẩn (được tối ưu hóa cao); chỉ cần đọc tệp khi bạn cần và để hệ thống xử lý phần còn lại.

Nếu thời gian để xử lý các tập tin đang trở thành một vấn đề, hai lựa chọn có thể giúp là:

  1. Cố gắng sắp xếp để sử dụng các file ngắn hơn. Có vẻ như bạn đang xử lý các tệp nhật ký hoặc một thứ gì đó - việc chạy chương trình của bạn thường xuyên hơn có thể giúp ít nhất là mang đến hiệu suất tốt hơn.

  2. Thay đổi cách dữ liệu được lưu trữ. Một lần nữa, tôi hiểu rằng các tập tin đến từ một số nguồn bên ngoài, nhưng có lẽ bạn có thể sắp xếp cho một công việc để chạy định kỳ chuyển đổi các tập tin thô để một cái gì đó mà bạn có thể đọc nhanh hơn.

Chúc may mắn.

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