getting started with std.csv

gjansen via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Apr 6 15:15:14 PDT 2015


Hi. I'm a D newbie(!) coming from a Fortran/C/Python background. 
I'm
struggling with the many new concepts needed in order to make any 
sense out
of the documentation or traceback messages 
(ranges/templates/...). For
example, the std.csv documentation is great but all the examples 
read from a
string rather than a file. I feel stupid but I'm having trouble 
with the
simple step of modifying the examples to read from a file. I can 
read the
whole file into a string in memory and then read the records from 
the string
just fine with csvReader (example A below) or read a line at a 
time from
the file and call csvReader using a single line (example B 
below), but
neither solution is satisfactory. In practice I need to read 
files with
up to 80 million records so I'd like to understand how to do this
properly/efficiently.

tia, Gerald

Example A
=========
import std.stdio, std.file, std.csv;

void main()
{
     std.file.write("test.csv", "0,1,abc\n2,3,def");
     scope(exit) std.file.remove("test.csv");

     auto lines = readText!(string)("test.csv");

     struct Rec { int a,b; char[] c; }
     foreach (Rec r; csvReader!Rec(lines)) {
         writeln("struct -> ", r);
     }
}


Example B
=========
import std.stdio, std.file, std.csv;

void main()
{
     std.file.write("test.csv", "0,1,abc\n2,3,def");
     scope(exit) std.file.remove("test.csv");

     struct Rec { int a,b; char[] c; }
     Rec r;
     foreach (line; File("test.csv", "r").byLine) {
         r = csvReader!Rec(line).front;
         writeln("struct -> ", r);
     }
}

Output
======
struct -> Rec(0, 1, "abc")
struct -> Rec(2, 3, "def")


More information about the Digitalmars-d-learn mailing list