如何枚举gzip存档文本文件的行

本文关键字:文本 文件 gzip 何枚举 枚举 | 更新日期: 2023-09-27 18:00:51

如何读取gzip文件的第一行和最后一行,并获得解压缩的行?文件很大,所以我不想全部阅读。。。

如何枚举gzip存档文本文件的行

如果不解压缩整个文件,就无法从压缩文件中获取第一位和最后一位。它不会比使用DotNetZip:更容易

using Ionic.Zlib;
...
string firstLine = null ;
string lastLine = null ;
using ( FileStream input = File.Open( @"c:'foo'bar'bazbat.gz" , FileMode.Open , FileAccess.Read , FileShare.Read ) )
using ( GZipStream gzip = new GZipStream( input , CompressionMode.Decompress ) )
using ( StreamReader reader = new StreamReader( gzip ) )
{
  firstLine = lastLine = reader.ReadLine() ;
  while ( null != (lastLine=reader.ReadLine()) )
  {
    // This space intentionally left blank
  }
}

编者按:DotNetZip曾经住在Codeplex。Codeplex已关闭。Codeplex上仍然可以使用旧的存档。看起来代码已经迁移到Github:

  • https://github.com/DinoChiesa/DotNetZip.看起来是原作者的回购
  • https://github.com/haf/DotNetZip.Semverd.这看起来是当前维护的版本。它还打包了一个可通过Nuget获得的https://www.nuget.org/packages/DotNetZip/

我找到了一种不用一次读取整个文件的方法,但它仍然枚举每一行,而不是只给我最后一行。

File.ReadLines的内部实现做到了这一点:

using (reader)
{ 
    String line = null;
    while ((line = reader.ReadLine()) != null)
    {
        yield return line; 
    }
} 

适用于解压缩:

private IEnumerable<string> ReadCompressedLines(string filePath)
{
    using (var srcStream = File.OpenRead(filePath))
    using (var decompressedStream = new GZipStream(srcStream, CompressionMode.Decompress))
    using (var reader = new StreamReader(decompressedStream))
    {
        String line = null;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    } 
}

然后你可以在IEnumerable上执行.First((和.Last((。