Ich habe eine Gzip-Datei mit einer TXT-Datei, die bereinigt werden muss. Ich mag von der GZipped Datei Zeile für Zeile lesen und dann zu einem Ausgang GZIP Datei, die alle in einem Schuss wie dies den gereinigten Inhalt schreiben:GZipStream mit StreamReader.ReadLine liest nur die erste Zeile
void ExtractAndFix(string inputPath, string outputPath) {
StringBuilder sbLine = new StringBuilder();
using (GZipStream gzInput = new GZipStream(new FileStream(inputPath, FileMode.Open), System.IO.Compression.CompressionMode.Decompress)) {
using (StreamReader reader = new StreamReader(gzInput, Encoding.UTF8)) {
using (GZipOutputStream gzipWriter = new GZipOutputStream(new FileStream(outputPath, FileMode.Create))) {
string line = null;
while ((line = reader.ReadLine()) != null) {
sbLine.Clear();
sbLine.Append(line.Replace("\t", " "));
sbLine.Append("\r\n");
byte[] bytes = Encoding.UTF8.GetBytes(sbLine.ToString());
gzipWriter.Write(bytes, 0, bytes.Length);
}
}
}
}
}
Aber aus irgendeinem Grunde, der Linie nennen = reader.ReadLine () in der while-Schleife liest nur einmal und gibt dann null zurück (Leser EOS = true). Ich habe dies sowohl mit der nativen C# -Komprimierungsbibliothek als auch mit dem ICSharpCode-Paket versucht, und ich bekomme das gleiche Verhalten. Mir ist klar, dass ich immer nur die komplette Datei extrahieren, dann säubern und komprimieren kann, aber ich hasse es, Ressourcen, Festplattenplatz usw. zu verschwenden. Anmerkung: Das sind große Dateien (bis zu mehreren GB komprimiert), also alles mit MemoryStream wird keine gute Lösung sein. Ist jemand schon einmal auf so etwas Seltsames gestoßen? Vielen Dank.
Sind Sie sicher, dass die Datei tatsächlich nur komprimierte Stream und nicht Zip-Archiv ist? –
@ Alexei Levenkov - Wenn es Zip wäre, wäre es nie in der Lage, den GZip-Stream zu erstellen, es würde fehlschlagen, weil der Dateityp falsch wäre – bruiseruser
Mögliches Duplikat von [Dekomprimieren mit GZipStream gibt nur die erste Zeile zurück] (http: // stackoverflow .com/questions/11204330/dekomprimieren-verwenden-gzipstream-returns-only-the-first-line – Sam