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

标签 c# text large-files

显示一个非常大的文本文件(这个特定文件超过 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/

相关文章:

c# - 以编程方式从插件获取当前的 Visual Studio IDE 解决方案目录

c# - 有人可以想出这个枚举器的更好版本吗?

c# - 构建验证服务层

html - 将 <p> 中的水平文本与倾斜的 <div> 对齐

python - python中输入过大如何处理?

c# - WPF C# : MVVM - Passing on the Sudoku from ViewModel -> View

html - 将单独的文本与 div 标记放在同一行

python - 从给定另一个值的数组中选择条目

c++ - 如何找出标识符的名称是否为数组?

python - 处理长度未知的行 block - 使用异步?