显示非常大的文本文件的最后10行的最有效方法是什么(此特定文件超过10GB).我只想写一个简单的C#应用程序,但我不确定如何有效地做到这一点.
读到文件的末尾,然后向后搜索,直到找到10个换行符,然后在考虑各种编码的情况下向前读.务必处理文件中行数少于10的情况.下面是一个实现(在你标记的C#中),通用化以查找numberOfTokens
位于path
编码的文件中的最后一个,encoding
表示标记分隔符tokenSeparator
; 结果返回为a string
(这可以通过返回IEnumerable
枚举标记来改进).
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); } }
我可能只是打开它作为二进制流,寻找到最后,然后备份寻找换行符.备份10(或11取决于最后一行)以找到您的10行,然后只读到最后并在您阅读的内容上使用Encoding.GetString将其转换为字符串格式.根据需要拆分.
尾巴?Tail是一个unix命令,它将显示文件的最后几行.Windows 2003 Server资源工具包中有Windows版本.
正如其他人所建议的那样,您可以有效地转到文件的末尾并向后阅读.但是,它有点棘手 - 特别是因为如果你有一个可变长度编码(如UTF-8),你需要狡猾地确保你得到"整个"字符.
你应该可以使用FileStream.Seek()移动到文件的末尾,然后向后工作,寻找\n直到你有足够的行.
我不确定它的效率如何,但在Windows PowerShell中获取文件的最后十行非常简单
Get-Content file.txt | Select-Object -last 10