您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

读取到文件的末尾,然后向后搜索,直到找到十个换行符,然后再考虑各种编码后再向前读取。确保处理文件中的行数少于十的情况。下面是一个实现(在C#中,您已对此进行了标记),该实现被通用化为找到numberOfTokens文件中的最后一个,该文件位于标记分隔符表示为的path编码encoding位置tokenSeparator。结果以a形式返回string(可以通过返回IEnumerable<string>枚举令牌的a 来改善)。

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);
    }
}
其他 2022/1/1 18:19:57 有514人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶