Error: variable i cannot be read at compile time
    thedeemon 
    dlang at thedeemon.com
       
    Sat Jan  6 15:32:14 UTC 2018
    
    
  
On Saturday, 6 January 2018 at 06:47:33 UTC, Vino wrote:
> On Friday, 5 January 2018 at 18:00:34 UTC, thedeemon wrote:
>> On Friday, 5 January 2018 at 17:59:32 UTC, thedeemon wrote:
>>>     Tuple!( staticMap!(Arr, ColumnTypes) ) res; // array of 
>>> tuples
>>
>> Sorry, I meant tuple of arrays, of course.
>
> Hi Deemon,
>
>  Thank you very much, I tested your code, initially the code 
> did not produce the expected output, and found an issue in the 
> the key line of code as below, after updating the output was as 
> expected. Can you please let me know how to change the array 
> from standard array to container array.
Here's a version with Array, it's very similar:
import std.algorithm: countUntil, joiner, sort, uniq, map;
import std.csv: csvReader;
import std.stdio: File, writeln;
import std.typecons: Tuple, tuple;
import std.meta;
import std.file : readText;
import std.container.array;
alias ColumnTypes = AliasSeq!(string, string, int);
auto readData(string fname) { // returns tuple of Arrays
     Tuple!( staticMap!(Array, ColumnTypes) ) res;
     foreach (record; 
fname.readText.csvReader!(Tuple!ColumnTypes)('\t'))
         foreach(i, T; ColumnTypes)
             res[i].insert(record[i]);
     return res;
}
auto compress(T)(ref Array!T col) {
     auto vals = Array!T( sort(col.dup[]).uniq );
     auto ks = Array!ptrdiff_t( col[].map!(v => 
vals[].countUntil(v)) );
     return tuple(vals, ks);
}
void main() {
     auto columns = readData("data.csv");
     foreach(i, ColT; ColumnTypes) {
         auto vk = compress(columns[i]);
         writeln(vk[0][]); //output data,   you can write files 
here
         writeln(vk[1][]); //output indices
     }
}
    
    
More information about the Digitalmars-d-learn
mailing list