如何读取gzip文件的第一行和最后一行并获得解压缩的行? 档案很大,所以我不想全部阅读......
答案 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()。