Có cách nào dễ dàng để lập trình xác định số dòng trong tệp văn bản không?Xác định số lượng dòng trong một tệp văn bản
Trả lời
Nghiêm túc muộn chỉnh sửa: Nếu bạn đang sử dụng .NET 4.0 hoặc cao hơn
Lớp File
có một phương pháp mới ReadLines
mà lười biếng liệt kê dòng chứ không phải là tham lam đọc tất cả chúng vào một mảng như ReadAllLines
. Vì vậy, bây giờ bạn có thể có cả hiệu quả và conciseness với:
var lineCount = File.ReadLines(@"C:\file.txt").Count();
gốc trả lời
Nếu bạn không quá bận tâm về tính hiệu quả, bạn chỉ có thể viết:
var lineCount = File.ReadAllLines(@"C:\file.txt").Length;
Để có phương pháp hiệu quả hơn, bạn có thể làm:
var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
while (reader.ReadLine() != null)
{
lineCount++;
}
}
Edit: Để đối phó với những câu hỏi về hiệu quả
Lý do tôi nói thứ hai là hiệu quả hơn đã được liên quan đến sử dụng bộ nhớ, không nhất thiết phải tăng tốc. Việc đầu tiên tải toàn bộ nội dung của tập tin vào một mảng có nghĩa là nó phải phân bổ ít nhất là bộ nhớ nhiều như kích thước của tập tin. Thứ hai chỉ lặp lại một dòng tại một thời điểm để nó không bao giờ phải phân bổ nhiều hơn một giá trị của bộ nhớ tại một thời điểm. Điều này không quan trọng đối với các tệp nhỏ, nhưng đối với các tệp lớn hơn, nó có thể là một vấn đề (nếu bạn cố gắng và tìm số dòng trong một tệp 4GB trên hệ thống 32 bit, ví dụ, nơi đơn giản là không đủ không gian địa chỉ chế độ người dùng để phân bổ một mảng lớn này).
Xét về tốc độ, tôi không mong đợi sẽ có nhiều thứ trong đó. Có thể là ReadAllLines có một số tối ưu hóa nội bộ, nhưng mặt khác nó có thể phải phân bổ một lượng lớn bộ nhớ. Tôi đoán rằng ReadAllLines có thể nhanh hơn cho các tệp nhỏ, nhưng chậm hơn đáng kể đối với các tệp lớn; mặc dù cách duy nhất để nói sẽ là đo lường nó bằng Đồng hồ bấm giờ hoặc mã hồ sơ.
Bạn có thể đọc nhanh và tăng bộ đếm, chỉ cần sử dụng vòng lặp để tăng, không làm gì với văn bản.
Đây phải là nhận xét chứ không phải là câu trả lời. – IamBatman
Các đơn giản nhất:
int lines = File.ReadAllLines("myfile").Length;
đếm kí tự xuống dòng/feeds dòng. Tôi tin rằng trong unicode họ vẫn còn 0x000D và 0x000A tương ứng. theo cách đó bạn có thể hiệu quả hoặc không hiệu quả như bạn muốn, và quyết định xem bạn có phải xử lý cả hai ký tự hay không
Nếu dễ dàng, bạn có nghĩa là một dòng mã dễ giải mã nhưng cơ hội không hiệu quả?
string[] lines = System.IO.File.RealAllLines($filename);
int cnt = lines.Count();
Đó có lẽ là cách nhanh nhất để biết có bao nhiêu dòng.
Bạn cũng có thể làm (tùy theo nếu bạn đang đệm nó trong)
#for large files
while (...reads into buffer){
string[] lines = Regex.Split(buffer,System.Enviorment.NewLine);
}
Có rất nhiều cách khác nhưng một trong những trên có lẽ là những gì bạn sẽ đi với.
Tôi cho rằng phương pháp này rất kém hiệu quả; bởi vì, bạn đang đọc toàn bộ tệp vào bộ nhớ, và vào một mảng chuỗi, không kém. Bạn không cần phải sao chép bộ đệm, khi sử dụng ReadLine. Xem câu trả lời từ @GregBeech. Xin lỗi vì mưa trên cuộc diễu hành của bạn. –
này sẽ sử dụng ít bộ nhớ, nhưng có lẽ mất nhiều thời gian
int count = 0;
string line;
TextReader reader = new StreamReader("file.txt");
while ((line = reader.ReadLine()) != null)
{
count++;
}
reader.Close();
Bạn có thể khởi động "wc .exe" thực thi (đi kèm với UnixUtils và không cần cài đặt) chạy như một quá trình bên ngoài. Nó hỗ trợ các phương thức đếm dòng khác nhau (như Unix vs mac vs windows).
Không có cách nào đủ nhanh để hữu ích. Chi phí của việc chỉ gọi thực thi sẽ gấp đôi (rõ ràng là cường điệu) là một vòng lặp tăng dần đơn lẻ. – Krythic
try {
string path = args[0];
FileStream fh = new FileStream(path, FileMode.Open, FileAccess.Read);
int i;
string s = "";
while ((i = fh.ReadByte()) != -1)
s = s + (char)i;
//its for reading number of paragraphs
int count = 0;
for (int j = 0; j < s.Length - 1; j++) {
if (s.Substring(j, 1) == "\n")
count++;
}
Console.WriteLine("The total searches were :" + count);
fh.Close();
} catch(Exception ex) {
Console.WriteLine(ex.Message);
}
Tùy chọn khả thi và tùy chọn mà tôi đã sử dụng sẽ thêm tiêu đề của riêng bạn vào dòng đầu tiên của tệp. Tôi đã làm điều này cho một định dạng mô hình tùy chỉnh cho trò chơi của tôi. Về cơ bản, tôi có một công cụ tối ưu hóa các tệp .obj của tôi, loại bỏ crap mà tôi không cần, chuyển đổi chúng thành bố cục tốt hơn, và sau đó viết tổng số dòng, khuôn mặt, tiêu chuẩn, đỉnh và UV kết cấu 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.
Điều này cũng hữu ích vì bạn chỉ cần lặp qua tệp một lần để tải nó vào, thay vì một lần để đếm các dòng và một lần nữa để đọc dữ liệu vào bộ đệm đã tạo của bạn.
Tại sao phương pháp thứ hai kém hiệu quả hơn phương pháp đầu tiên? Nó không rõ ràng từ mã. – Sklivvz
Cảm giác ruột của tôi sẽ là lần đầu tiên có thể nhanh hơn, nhưng đó chỉ là phỏng đoán – johnc
Ghi chú nhỏ: vì Chuỗi là kiểu tham chiếu mảng sẽ là kích thước của số dòng x kích thước của một con trỏ, nhưng bạn chính xác rằng nó vẫn cần lưu trữ văn bản, mỗi dòng như một đối tượng String đơn. –