On 3/14/21 9:36 PM, sharkloc wrote:
I want to read the content(file.gz) line by line,the following code is not friendly to large files of hundreds of Gb, and the memory overhead is also very large.


import std.stdio;
import std.process;
import std.string;

void main(string[] args){

     string fileName = args[1];
     string command = "gzip -dc " ~ fileName ;
     auto dmd = executeShell(command);

     if(dmd.status != 0){
         writeln("Compilation failed:\n", dmd.output);
     }
     else{
         auto all=chomp(dmd.output).split("\n");
         writeln(typeid(all));
         for(int i=0; i<all.length; i++){
             writeln(all[i]);
         }
     }

}

It's not super-user-friendly, but iopipe excels at this kind of stuff (untested):

// dub dependencies: [iopipe, io]
import iopipe.bufpipe;
import iopipe.textpipe;
import iopipe.zip;
import iopipe.refc;
import std.io;

import std.stdio;

void main(string[] args) {
   string fileName = args[1];
   auto lineRange = File(fileName) // open file
       .refCounted // make it copyable
       .bufd // buffer it
       .unzip // unzip it
       .assumeText // assume the binary data is utf8 text
       .byLineRange!true; // true = discard newlines

   foreach(line; lineRange)
       writeln(line);
}

-Steve

Reply via email to