On 02/17/2013 04:44 PM, Brian Brady wrote:

> 1) my full csv is 4000 variables wide, and I really don't want to
> declare each variable in the struct (I've created a smaller one to test)

Looking at the sample file you provide, what you call "variables" look like data points.

> 2) what if I wanted to read in different csvs of different sizes, I
> don't want to have to change my program each time?

Then you need something other than a CSV reader. Ordinarily, records in a CSV files have a known number of fields.

> After much googling, I thought I found something on RosettaCode that
> would do what I wanted
> (http://rosettacode.org/wiki/Add_a_variable_to_a_class_instance_at_runtime#D)
>
> but when I try to use it, it doesn't work. (Its actually adding to a
> class, which may be better than a struct in this instance, but
> regardless, it doesn't work)

That is not a natural idiom for D and I don't think it is needed here. :)

> The csv I would eventually like to read in is of the form:
>
> test1,303,-140,-166,-317,-310,414,-157,-360,-120,-89
> test10,-1,70,-57,-101,112,137,-134,9,195,86
> test100,367,78,-417,123,220,-234,-170,236,-218,-351
> test1000,309,-178,-674,-202,514,218,-165,76,-82,-328
> test10000,-131,142,6,-143,80,46,29,48,-84,-113

What I see there is a label and a number of integers. Here is a simple parser that takes advantage of the %( and %) grouping format specifiers:

import std.stdio;
import std.format;

struct Data
{
    string label;
    int[] values;
}

int main(string[] args)
{
    if (args.length != 2) {
        stderr.writefln("Usage: %s <input-file-name>", args[0]);
        return 1;
    }

    auto file = File(args[1], "r");

    Data[] data;

    foreach (line; file.byLine) {
        string label;
        int[] values;
        formattedRead(line, "%s,%(%s,%)", &label, &values);
        data ~= Data(label, values);
    }

    writeln(data);

    return 0;
}

Ali

--
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html

Reply via email to