Bạn có thể đọc ký tự tệp theo ký tự khớp với từng ký tự trong chuỗi tìm kiếm cho đến khi bạn đến cuối chuỗi tìm kiếm trong trường hợp bạn khớp. Nếu bất kỳ lúc nào, ký tự bạn đã đọc không khớp với ký tự bạn đang tìm kiếm, hãy đặt lại số phù hợp thành 0 và bắt đầu lại. Ví dụ: (**** mã giả/không được thử nghiệm ****):
byte[] lookingFor = System.Text.Encoding.UTF8.GetBytes("hello world");
int index = 0;
int position = 0;
bool matchFound = false;
using (FileStream fileStream = new FileStream(fileName, FileMode.Open))
{
while (fileStream.ReadByte() == lookingFor[index])
{
index++;
if (index == lookingFor.length)
{
matchFound = true;
position = File.position - lookingFor.length;
break;
}
}
}
Đó là một trong nhiều thuật toán bạn có thể sử dụng (mặc dù nó có thể được tắt bằng một thuật toán kiểm tra độ dài). Nó sẽ chỉ tìm thấy trận đấu đầu tiên, do đó bạn có thể muốn quấn vòng lặp while trong vòng lặp khác để tìm nhiều kết quả phù hợp.
Ngoài ra, một điều cần lưu ý về việc đọc từng dòng tệp là nếu chuỗi mong muốn khớp với các dòng nhịp bạn sẽ không tìm thấy nó.Nếu đó là tốt thì bạn có thể tìm kiếm từng dòng nhưng nếu bạn cần chuỗi tìm kiếm để mở rộng dòng bạn sẽ muốn sử dụng một thuật toán như tôi đã nêu chi tiết ở trên.
Cuối cùng, nếu bạn đang tìm kiếm tốc độ tốt nhất, có vẻ như bạn đang có, bạn sẽ muốn di chuyển mã ở trên để sử dụng StreamReader hoặc một số trình đọc được đệm khác.
Nguồn
2010-01-19 17:30:16
Bạn đã lược tả chương trình của mình chưa? –
Tệp này có thay đổi thường xuyên hoặc tĩnh không? Nếu nó tĩnh, bạn có thể thực hiện một thuật toán ngoại tuyến và lập chỉ mục nó để bạn có thể nhanh chóng tiếp cận phần con được yêu cầu của tài liệu khi chạy. – Polaris878
Tôi đã thấy rất nhiều đề xuất đọc phần tệp một phần vào bộ nhớ, nhưng làm cách nào bạn xử lý được cụm từ mà cụm từ tìm kiếm bắt đầu trong một phân đoạn tệp và kết thúc bằng một phân đoạn tệp khác. Tải các phân đoạn chồng chéo có lẽ, nếu trường hợp này xảy ra, đoạn tiếp theo được đọc phải chứa toàn bộ cụm từ – ProfK