显示一个非常大的文本文件(这个特定文件超过 10GB)的最后 10 行的最有效方法是什么。我想只写一个简单的 C# 应用程序,但我不确定如何有效地做到这一点。
最佳答案
读到文件末尾,然后向后查找直到找到十个换行符,然后考虑各种编码向前读到末尾。一定要处理文件中行数少于 10 的情况。下面是一个实现(在你标记的 C# 中),概括为找到最后一个 numberOfTokens
在位于 path
的文件中编码为 encoding
其中 token 分隔符由 tokenSeparator
表示;结果返回为 string
(这可以通过返回枚举标记的 IEnumerable<string>
来改进)。
public static string ReadEndTokens(string path, Int64 numberOfTokens, Encoding encoding, string tokenSeparator) {
int sizeOfChar = encoding.GetByteCount("\n");
byte[] buffer = encoding.GetBytes(tokenSeparator);
using (FileStream fs = new FileStream(path, FileMode.Open)) {
Int64 tokenCount = 0;
Int64 endPosition = fs.Length / sizeOfChar;
for (Int64 position = sizeOfChar; position < endPosition; position += sizeOfChar) {
fs.Seek(-position, SeekOrigin.End);
fs.Read(buffer, 0, buffer.Length);
if (encoding.GetString(buffer) == tokenSeparator) {
tokenCount++;
if (tokenCount == numberOfTokens) {
byte[] returnBuffer = new byte[fs.Length - fs.Position];
fs.Read(returnBuffer, 0, returnBuffer.Length);
return encoding.GetString(returnBuffer);
}
}
}
// handle case where number of tokens in file is less than numberOfTokens
fs.Seek(0, SeekOrigin.Begin);
buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
return encoding.GetString(buffer);
}
}
关于c# - 获取大于 10GB 的超大文本文件的最后 10 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/398378/