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

时间:2015-07-01 16:22:45

标签: c# file

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

2 个答案:

答案 0 :(得分:1)

在没有解压缩整个事物的情况下,无法从压缩文件中获取第一个和最后一个位。并且它比使用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已关闭。旧档案仍为available at Codeplex。看起来代码已迁移到Github:

答案 1 :(得分:0)

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

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()。