C# 只读第一行,使用压缩文本文件的 StreamReader

Posted

技术标签:

【中文标题】C# 只读第一行,使用压缩文本文件的 StreamReader【英文标题】:C# Read only first line, using StreamReader of a zipped text file 【发布时间】:2012-02-21 17:24:23 【问题描述】:

我正在尝试仅读取压缩 csv 文件的第一行。我使用了下面的代码,但收到错误“GZIP 标头中的幻数不正确”。显然,这与 GZIP 和 ZIP 格式不同这一事实有关,但即使使用 DotNetZipLib 库或 SharpZip,我似乎也无法正常工作。

using (GZipStream gzipStream = new GZipStream(File.OpenRead(fileName), CompressionMode.Decompress))
            
                using(StreamReader sr = new StreamReader(gzipStream))
                
                    //Matt try something like this as a hint / starting point 
                    While(sr.Read())
                    
                      row = sr.ReadLine();
                    

                
            

你们中有人知道如何处理标准 zip 文件(不是 gzip)并将内容流式传输到 StreamReader 对象,以便我可以轻松读取压缩文本文件的第一行吗?我不寻找在打开文本文件之前完全解压缩整个 zip 文件的解决方案。我寻找与上述类似的解决方案,但可以处理 zip 文件。我也不想通过字节数组走令人讨厌的路线,并且不得不从数组中重建第一行,因为它需要了解第一行的确切内容(数据类型、分隔符......)。

谢谢

【问题讨论】:

所以你告诉我们的错误是因为GZip和Zip不一样,你知道的。当您使用 DotNetZipLib 或 SharpZip 时会发生什么? 尝试谷歌搜索“C#how to read compressed file using a StreamReader”有很多例子马特 GZip 和 Zip 不是一回事。您肯定需要使用 DotNetZipLib 或 SharpZip 之类的东西。您能否发布您尝试使用的代码,也许我们可以为您提供建议? 我试过但没有看到这些库能够流式传输到 StreamReader。也许我错过了一些东西。我必须先完全解压缩,才能读取 zip 文件的第一行。 我会为你做一个谷歌搜索并发布一个链接 抓紧这里是一个指向 DotNetZip 库的链接dotnetzip.codeplex.com 【参考方案1】:

例如,这里是 Matt,您也可以查看此代码示例 这使用 SharpZipLib 库

var zip = new ZipInputStream(File.OpenRead(@"C:\MyZips\myzip.zip"));
var filestream = new FileStream(@"C:\\MyZips\myzip.zip", FileMode.Open, FileAccess.Read);
ZipFile zipfile = new ZipFile(filestream);
ZipEntry item;
while ((item = zip.GetNextEntry()) != null)

     Console.WriteLine(item.Name);
     using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
     
      // stream with the file
          Console.WriteLine(s.ReadToEnd());
     
 

【讨论】:

DJ KRAZE,它有效,非常感谢。我浪费了 3 个小时来让它工作,因为我看不到将 StreamReader 与库结合使用的参考。太棒了,你让我更头疼了。 太棒了..我很高兴我能够迅速为挽救生命做出贡献..lol任何其他问题都可以随时联系【参考方案2】:

上面的答案对我不起作用(它在运行时抛出了一个错误:“item”的空引用)所以我稍微修改了代码。(一个名为“text.txt”的文本文件被压缩在一个名为“archive”的zip中.zip") 这个在VB.NET中,使用SHARPZIPLIB库(你必须将它导入VB并在公共类mainform之前调用它。

这里是代码:

       Imports ICSharpCode.SharpZipLib.Zip

'现在把下面的代码放在一个私有子中(我把它放在私有子button_click中)

       Dim zip As New ZipInputStream(File.OpenRead("c:\archive.zip")) 'location of the zip file
       Dim filestream As New FileStream("c:\archive.zip", FileMode.Open,FileAccess.Read)
        Dim zipfile As ZipFile = New ZipFile(filestream)

        Dim item As ICSharpCode.SharpZipLib.Zip.ZipEntry
        item = New ZipEntry("text.txt")

        While (Not (zip.GetNextEntry) Is Nothing)
            Console.WriteLine(item.Name)
            Dim s As StreamReader = New StreamReader(zipfile.GetInputStream(item))
            ' stream with the file
            MsgBox(s.Readline)

        End While
        end sub

当您运行代码时,将弹出消息框,其中包含在文本文件 text.txt 的第一行中输入的文本 希望这可以帮助。干杯!

【讨论】:

我指定了 C# 而不是 VB.Net(尽管易于移植)。此外,我选择的答案对我有用。

以上是关于C# 只读第一行,使用压缩文本文件的 StreamReader的主要内容,如果未能解决你的问题,请参考以下文章

C# 用LZ4压缩文本

c#如何使一个文本框变为不可编辑?但是又可以复制里面的数据?

linux文本处理工具

实现PHP服务端和c#客户端数据交换

在 C# 中获取 SharePoint 富文本字段值

c语言逐行读取文件?