On Wednesday, 21 September 2022 at 13:08:14 UTC, jmh530 wrote:
On Wednesday, 21 September 2022 at 05:31:48 UTC, mw wrote:
Hi,

I'm just wondering what is the best way to read CSV data file into Mir (2d array) ndslice? Esp. if it can parse date into int/float.

I searched a bit, but can't find any example.


Thanks.

It probably can't hurt to try the simplest approach first. `std.csv` can return an input range that you can then use to create a ndslice. Offhand, I don't know what D tools are an alternative to `std.csv` for reading CSVs.

ndslice assumes homogenous data, but you can put the Dates (as Date types) as part of the labels (as Data Frames). However, there's a bit to be desired in terms of getting that functionality integrated into the rest of the package [1].

[1] https://github.com/libmir/mir-algorithm/issues/426

I just tried doing it with `std.csv`, but my version was a bit awkward since it doesn't seem quite so straightforward to just take the result of csvReader and put it in a array. I had to read it in there. I also wanted to allocate the array up front, but to do that I needed to know how big it was and ended up doing two passes on reading the data, which isn't ideal.

```d
import std.csv;
import std.stdio: writeln;
import mir.ndslice.allocation: slice;

void main() {
string text = "date,x1,x2\n1/31/2010,65,2.5\n2/28/2010,123,7.5";
    auto records_firstpass = text.csvReader!double(["x1","x2"]);
    auto records_secondpass = text.csvReader!double(["x1","x2"]);
    size_t len = 0;
    foreach (record; records_firstpass) {
        len++;
    }
    auto data = slice!double(len, 2);
    size_t i = 0;
    size_t j;
    foreach (record; records_secondpass)
    {
        j = 0;
        foreach (r; record) {
            data[i, j] = r;
            j++;
        }
        i++;
    }
    writeln(data);
}
```

Reply via email to