C # Только для чтения в первой строке, используя StreamReader сжатого текстового файла - PullRequest
3 голосов
/ 21 февраля 2012

Я пытаюсь прочитать только первую строку заархивированного 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-файлы. Я также не хочу идти по гиковому маршруту через байтовые массивы и восстанавливать первую строку из массива, так как для этого потребуется знание точного содержимого первой строки (типы данных, разделители, ...).

Спасибо

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

например, Мэтт, это то, что вы могли бы сделать, а также проверить этот пример кода Для этого используется библиотека 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());
     }
 }
0 голосов
/ 20 января 2014

Приведенный выше ответ не работал для меня (он вызвал ошибку во время выполнения: nullreference для «item»), поэтому я немного изменил код (текстовый файл с именем «text.txt» заархивирован в zip-архиве с именем «archive».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 Надеюсь, это поможет. Ура!

...