Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
May 13, 2014 naming a variable at runtime | ||||
---|---|---|---|---|
| ||||
Hi clever people I'm trying to do something which I thought would be easy. Read a file in, and for every row, create a array. I want to be able to name the rows, as they are built. So when row 1 is read in I get int[] bob_1 = new int[0]; when the second row is read in, I get int[] bob_2 = new int[0]; So at the end of running my program I effectively want bob_1, bob_2 and bob_3. And then I can do something more interesting with them ... I realise this is now slightly beyond my if-then-else capabilities, and was wondering if I could get some direction. Thanks B The contents of /home/bob/test.csv -1, -1, 1, -1, -1 -1, 1, 1, 1, -1 1, -1, -1, 1, -1 My Program #!/usr/bin/rdmd import std.stdio; import std.array; import std.conv; import std.string; void main() { string inputFile = "/home/bob/test.csv"; // string inputFile = "-1, -1, 1, -1, -1\n-1, 1, 1, 1, -1\n1, -1, -1, 1, -1\r\n"; auto readInFile = File(inputFile); int count = 0; foreach(line; readInFile.byLine()) { int[] bob = new int[0]; // int[] bob_NUMBER_ME = new int[0]; foreach(item;line.split(",")) { writeln(strip(item)); bob ~= to!int(strip(item)); } writeln(bob); writefln("Line number %d", count); count++; } writeln("Done"); } |
May 13, 2014 Re: naming a variable at runtime | ||||
---|---|---|---|---|
| ||||
Posted in reply to InfinityPlusB | You should look into associative arrays ( http://dlang.org/hash-map .) Example: import std.stdio; void main() { int[][string] mybobs; mybobs["bob_1"] = [-1, -1, 1, -1, -1]; mybobs["bob_2"] = [-1, 1, 1, 1, -1]; mybobs["bob_3"] = [-1, 1, 1, 1, -1]; writeln(mybobs); } |
May 13, 2014 Re: naming a variable at runtime | ||||
---|---|---|---|---|
| ||||
Posted in reply to safety0ff | On Tuesday, 13 May 2014 at 03:54:33 UTC, safety0ff wrote:
> You should look into associative arrays ( http://dlang.org/hash-map .)
>
> Example:
>
> import std.stdio;
>
> void main()
> {
> int[][string] mybobs;
> mybobs["bob_1"] = [-1, -1, 1, -1, -1];
> mybobs["bob_2"] = [-1, 1, 1, 1, -1];
> mybobs["bob_3"] = [-1, 1, 1, 1, -1];
> writeln(mybobs);
> }
Thanks for the quick reply, I'll look into that.
My issue is (which I didn't explain clearly, sorry) how do I do it with an unknown number of lines?
So my example has 3 lines. What if it had 300? or 3000?
Basically so I can run the same piece of code for any size file, and it will create a new named array for each line.
So I assume(?) I have to do something that will "name" each of these arrays at runtime.
So,
for(x;1 ... n)
bob_x = ...
|
May 13, 2014 Re: naming a variable at runtime | ||||
---|---|---|---|---|
| ||||
Posted in reply to InfinityPlusB | On 05/12/2014 08:47 PM, InfinityPlusB wrote: > I want to be able to name the rows, as they are built. First, no, you cannot name variables at run time because variables are concepts of source code; they don't exist in the compiled program. > So when row 1 is read in I get > int[] bob_1 = new int[0]; > when the second row is read in, I get > int[] bob_2 = new int[0]; Well, it looks like a bob array. :) How about "naming" those rows as bob[0], bob[1], etc. > So at the end of running my program I effectively want bob_1, bob_2 and > bob_3. Would zero-indexing work? > And then I can do something more interesting with them ... > > I realise this is now slightly beyond my if-then-else capabilities, and > was wondering if I could get some direction. I had used the same naming scheme as a segway to my arrays chapter: http://ddili.org/ders/d.en/arrays.html > The contents of /home/bob/test.csv > -1, -1, 1, -1, -1 > -1, 1, 1, 1, -1 > 1, -1, -1, 1, -1 > > My Program > #!/usr/bin/rdmd > import std.stdio; > import std.array; > import std.conv; > import std.string; > > void main() > { > string inputFile = "/home/bob/test.csv"; > // string inputFile = "-1, -1, 1, -1, -1\n-1, 1, 1, 1, -1\n1, -1, -1, > 1, -1\r\n"; > auto readInFile = File(inputFile); > int count = 0; > foreach(line; readInFile.byLine()) > { > int[] bob = new int[0]; > // int[] bob_NUMBER_ME = new int[0]; > foreach(item;line.split(",")) > { > writeln(strip(item)); > bob ~= to!int(strip(item)); > } > writeln(bob); > writefln("Line number %d", count); > count++; > } > writeln("Done"); > } Here is the inner loop with minimal changes to your program: int[][] bob; // <== Array of arrays foreach(line; readInFile.byLine()) { int[] row; // <== Make a new row foreach(item;line.split(",")) { writeln(strip(item)); row ~= to!int(strip(item)); } bob ~= row; // <== Add the row writefln("Line number %d", count); count++; } writeln(bob); Ali |
May 13, 2014 Re: naming a variable at runtime | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Tuesday, 13 May 2014 at 04:26:04 UTC, Ali Çehreli wrote: > On 05/12/2014 08:47 PM, InfinityPlusB wrote: > > > I want to be able to name the rows, as they are built. > > First, no, you cannot name variables at run time because variables are concepts of source code; they don't exist in the compiled program. That's good to know, I'll stop trying to make that happen. :P > Here is the inner loop with minimal changes to your program: > > int[][] bob; // <== Array of arrays > > foreach(line; readInFile.byLine()) > { > int[] row; // <== Make a new row yup, that will work. If I wasn't hell bent on naming variables, I probably would have figured this out. :P Thanks. |
May 13, 2014 Re: naming a variable at runtime | ||||
---|---|---|---|---|
| ||||
Posted in reply to InfinityPlusB | On 13/05/14 06:32, InfinityPlusB wrote: > yup, that will work. > If I wasn't hell bent on naming variables, I probably would have figured > this out. :P Perhaps you could use an associative array. Then you get sort of named variables. -- /Jacob Carlborg |
Copyright © 1999-2021 by the D Language Foundation