Error: variable i cannot be read at compile time
thedeemon
dlang at thedeemon.com
Fri Jan 5 17:50:13 UTC 2018
On Friday, 5 January 2018 at 13:09:25 UTC, Vino wrote:
>> Sorry, I'm asking what problem are you solving, what the
>> program should do, what is its idea. Not what code you have
>> written.
>
> Hi,
>
> I am trying to implement data dictionary compression, and below
> is the function of the program,
>
> Function read:
> This function read a csv file which contains 3 column as and
> stores the value of each column in an array Col1: Array1
> (Ucol1), Col2: Array2 (Ucol2), Col3: Array3(Ucol3) and returns
> the data.
>
> CSV file content:
> Miller America 23
> John India 42
> Baker Australia 21
> Zsuwalski Japan 45
> Baker America 45
> Miller India 23
>
> Function Main
> This function receives the data from the function read.
> Creates an array based of the function return type – (
> typeof(read()[i]) Data );
> Sorts the data and removes the duplicates and stores the data
> in the above array.
> Then using “countUntil” function we can accomplish the data
> dictionary compression.
Thank you for the explanation, this is a nice little task.
Here's my version of solution. I've used ordinary arrays instead
of std.container.array, since the data itself is in GC'ed heap
anyway.
I used csv file separated by tabs, so told csvReader to use '\t'
for delimiter.
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.array : array;
//we know types of columns, so let's state them once
alias ColumnTypes = AliasSeq!(string, string, int);
alias Arr(T) = T[];
auto readData() {
auto file = File("data.csv", "r");
Tuple!( staticMap!(Arr, ColumnTypes) ) res; // tuple of arrays
foreach (record;
file.byLineCopy.joiner("\n").csvReader!(Tuple!ColumnTypes)('\t'))
foreach(i, T; ColumnTypes)
res[i] ~= record[i]; // here res[i] can have
different types
return res;
}
//compress a single column
auto compress(T)(T[] col) {
T[] vals = sort(col.dup[]).uniq.array;
auto ks = col.map!(v => col.countUntil(v)).array;
return tuple(vals, ks);
}
void main() {
auto columns = readData();
foreach(i, ColT; ColumnTypes) {
// here the data can have different type for different i
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