获取大于10GB的超大文本文件的最后10行

显示超大文本文件(此特定文件超过10GB)的最后10行的最有效方法是什么。我当时只是想编写一个简单的C#应用​​程序,但不确定如何有效地做到这一点。

回答:

读取到文件的末尾,然后向后搜索,直到找到十个换行符,然后再考虑各种编码后再向前读取。确保处理文件中的行数少于十的情况。下面是一个实现(在C#中,您已对此进行了标记),该实现被通用化为找到numberOfTokens文件中的最后一个,该文件位于标记分隔符表示为的path编码encoding位置tokenSeparator。结果以a形式返回string(可以通过返回IEnumerable<string>枚举令牌的a

来改善)。

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);

}

}

以上是 获取大于10GB的超大文本文件的最后10行 的全部内容, 来源链接: utcz.com/qa/398612.html

回到顶部