首页 >后端开发 >C++ >如何在C#中高效读取10GB文本文件的最后10行?

如何在C#中高效读取10GB文本文件的最后10行?

Patricia Arquette
Patricia Arquette原创
2024-12-29 02:03:09455浏览

How to Efficiently Read the Last 10 Lines of a 10GB  Text File in C#?

检索海量文本文件(超过 10GB)的最后 10 行

在文本处理领域,一个常见的挑战是提取非常大的文本文件的最后几行。当处理超过 10GB 的文件时,传统方法可能会力不从心。本文使用 C# 提出了此问题的有效解决方案,并提供了一个代码片段来演示其实现。

为了有效检索最后 10 行,该策略涉及从末尾向后遍历文件。由于行数可能是可变的,因此我们迭代地向后查找,直到遇到 10 个换行符。到达此点后,我们向前读取剩余内容以捕获最后 10 行。

考虑以下实现:

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,适当调整读取操作。编码参数允许根据文件的编码进行自定义,并且可以使用 tokenSeparator 来检索不同分隔符的最后连续元素。

通过采用这种方法,您可以有效地检索海量文本的最后 10 行文件,确保高效处理和准确结果。

以上是如何在C#中高效读取10GB文本文件的最后10行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn