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

如何在 C# 中高效地从 10GB 文本文件中提取最后 10 行?

Susan Sarandon
发布: 2024-12-30 06:28:11
原创
169 人浏览过

How Can I Efficiently Extract the Last 10 Lines from a 10GB  Text File in C#?

获取海量文本文件(超过 10GB)的最后 10 行:一种高效的 C# 方法

处理超过 10 GB 的海量文本文件时10GB,提取最后几行可能会带来性能挑战。以下是如何使用 C# 有效实现此目的:

代码实现:

这种通用方法允许您指定要提取的令牌数量 (numberOfTokens)、文件路径(路径)、编码(encoding)和标记分隔符(tokenSeparator):

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);
    }
}
登录后复制

工作原理:

  1. 计算指定编码中字符的大小。
  2. 求到文件末尾并开始向后移动,读取标记分隔符字节。
  3. 计算遇到的令牌,并在达到所需令牌数量时停止。
  4. 从当前位置读取剩余字节到文件末尾。
  5. 处理文件中token数量小于预期数量的情况。

通过利用这种方法,您可以高效地提取大量文本文件的最后几行,解决了其大尺寸带来的挑战。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板