2011-09-26 38 views
14

Có cách nào để lấy số dòng trong tệp văn bản lớn, nhưng không đọc nội dung tệp hoặc đọc tệp để kết thúc và đếm ++.Làm thế nào để có được số dòng mà không cần đọc tập tin để kết thúc

Có thể có một số Thuộc tính tệp nhưng không thể tìm thấy nó. Bởi vì tôi có thể trong một số trường hợp tôi sẽ nhận được tổng số dòng và so sánh nó với dòng hiện tại để hiển thị phần trăm, và chỉ cho một phần trăm hiển thị nó có thể là ngu ngốc để đọc đầu tiên tất cả nội dung hơn đọc nó một lần nữa để hiển thị nguyên văn bản tại người dùng.

bests

+0

Nếu bạn kiểm soát định dạng tệp, bạn có thể tiêm số dòng dưới dạng một số dữ liệu meta trong tệp bên ngoài hoặc trong tiêu đề của tệp. Bạn cũng có thể đọc qua, từng ký tự và kiểm tra các ký tự dòng mới. Tuy nhiên, điều đó sẽ không quá nhanh. – Travis

+0

Giống như mọi người đã nói, một lựa chọn khả thi sẽ là thêm tiêu đề của riêng bạn vào tệp. Tôi đã thực hiện việc này để triển khai mô hình Wavefront tùy chỉnh cho trò chơi của mình. Về cơ bản, tôi có một công cụ tối ưu hóa các tệp .obj, loại bỏ crap mà tôi không cần, và sau đó viết tổng số dòng, khuôn mặt, normals, vertices và UV texture trên dòng đầu tiên.Dữ liệu đó sau đó được sử dụng bởi các bộ đệm mảng khác nhau khi mô hình được tải. – Krythic

Trả lời

19

No. Bạn phải đọc tệp. Hãy xem xét lưu trữ nó ở đầu của tập tin hoặc trong một tập tin riêng biệt khi bạn viết các tập tin nếu bạn muốn tìm thấy nó một cách nhanh chóng mà không cần đếm.

Lưu ý rằng bạn có thể truyền tập tin, và đó là đáng ngạc nhiên nhanh:

int count = File.ReadLines(path).Count(); 

Bởi vì tôi có thể là trong một số trường hợp tôi sẽ nhận được Tổng Số Line và so sánh nó với dòng hiện tại để hiển thị Tỷ lệ phần trăm, và chỉ cho một phần trăm hiển thị nó có thể là ngu ngốc để đọc đầu tiên tất cả các nội dung hơn đọc nó một lần nữa để hiển thị văn bản thô tại người sử dụng.

Ồ, chỉ cần lấy kích thước tệp và độ dài của mỗi dòng theo byte và giữ tổng số byte tích lũy được xử lý cho đến thời điểm này.

+2

Tôi nghĩ rằng sẽ gây ra rắc rối bộ nhớ, bởi vì tôi xử lý với File của < > 8Gb Log File được tạo từ một ứng dụng khác – Burimi

+1

@Cody: Phương thức 'File.ReadLines' không đọc toàn bộ tập tin cùng một lúc, vì vậy nó sẽ không sử dụng nhiều ký ức. Tuy nhiên, nó chỉ có sẵn trong Framework 4 trở lên. – Guffa

+1

@Cody: bạn có thể muốn thử điều đó. 'File.ReadLines' trả về một' IEnumerable '- nó không đọc toàn bộ tập tin vào bộ nhớ cùng một lúc. –

13

Không, không có cách nào khác.

Một tệp không dựa trên dòng (hoặc thậm chí dựa trên ký tự), do đó không có thông tin meta về số dòng (hoặc thậm chí số ký tự). Dữ liệu meta duy nhất về nội dung là độ dài tính theo byte.

Nếu bạn có một số thông tin bổ sung về tệp, ví dụ: mỗi dòng có cùng độ dài và sử dụng mã hóa 8 bit để số ký tự giống như số byte, bạn có thể tính số dòng từ kích thước tệp.

+0

+1 ... và có chuỗi kết thúc được xác định, ví dụ: '\ r \ n' so với' \ n' – RedFilter

+0

@Guffa, bạn có thể cho FileZilla biết rằng: P - no just Joking, im xử lý bằng FileZilla Log File và chúng quá lớn nên tôi nghĩ tôi sẽ không hiển thị phần trăm. – Burimi

+0

@Cody: Bạn có thể sử dụng độ dài đường trung bình ước tính để nhận được tiền lệ xấp xỉ hoặc tính phần trăm dựa trên vị trí tệp thay vì dòng. – Guffa

5

Như Guffa và Jason đã nói, không có cách nào để có được các dòng khác ngoài việc đọc đến cùng.

Để giải quyết vấn đề của bạn khác nhau:

Nếu bạn chỉ quan tâm đến màn hình hiển thị tỷ lệ phần trăm bạn có thể thử để acummulate rằng giá trị từ tổng kích thước tập tin và dòng mà bạn đang xem xét. Bạn cần phải áp dụng một số thủ thuật voodoo ở đó để nhận được các byte thực sự đọc (như đã nói, bạn đã đọc đến dòng 10, và tổng cộng 200 byte hoặc bất kỳ thứ gì) và kích thước tệp là 400bytes. Bạn có thể đoán rằng bạn đang ở mức 50%, mà không cần phải biết tổng số dòng.

Thats chỉ một số ngẫu nhiên ở đó, btw.

+0

+1 để được giải thích và có thể nhập – Burimi

+0

Nếu bạn chỉ cần phần trăm chứ không phải tổng số dòng tôi nghĩ rằng nó hoàn toàn có thể làm được – UrbanEsc

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