当前位置:  开发笔记 > 编程语言 > 正文

获取最后10行非常大的文本文件> 10GB

如何解决《获取最后10行非常大的文本文件>10GB》经验,为你挑选了6个好方法。

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



1> jason..:

读到文件的末尾,然后向后搜索,直到找到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);
    }
}


假定编码的字符大小始终相同.在其他编码中它可能会变得棘手.
而且,正如Skeet告诉我的那样,Read方法无法保证读取所请求的字节数.您必须检查返回值以确定您是否已完成阅读...
我注意到这个程序在文件~4MB上执行时非常及时.任何建议的改进?或其他关于拖尾文件的C#示例?

2> ctacke..:

我可能只是打开它作为二进制流,寻找到最后,然后备份寻找换行符.备份10(或11取决于最后一行)以找到您的10行,然后只读到最后并在您阅读的内容上使用Encoding.GetString将其转换为字符串格式.根据需要拆分.



3> w4g3n3r..:

尾巴?Tail是一个unix命令,它将显示文件的最后几行.Windows 2003 Server资源工具包中有Windows版本.


我注意到了.我只是觉得无论如何我都会扔掉它.
他的标签表明他是在C#解决方案之后

4> Jon Skeet..:

正如其他人所建议的那样,您可以有效地转到文件的末尾并向后阅读.但是,它有点棘手 - 特别是因为如果你有一个可变长度编码(如UTF-8),你需要狡猾地确保你得到"整个"字符.


@CodesInChaos:我没有说`\ r`和`\n`不是单字节...但*其他*字符占用更多字节(任何超过U + 0080)所以你需要考虑到 - 如果你在文件中寻找某个任意点,你可能是"中等字符"并且必须考虑到这一点.UTF-8使它可行(但不容易),因为你总是*告诉*当你是中等字符...但其他编码可能不会.我编写代码来向后读取文件,这是一件痛苦的事情.

5> Lolindrath..:

你应该可以使用FileStream.Seek()移动到文件的末尾,然后向后工作,寻找\n直到你有足够的行.



6> Eric Ness..:

我不确定它的效率如何,但在Windows PowerShell中获取文件的最后十行非常简单

Get-Content file.txt | Select-Object -last 10


这种方法在~20 MB文件时已经非常迟缓了.
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有