Just trying a very simple thing and it's pretty hard: "Read a CSV file (raw_data) that has a ; separator so that I can iterate over the lines and access the fields."

        csv_data = raw_data.byLine.joiner("\n")

From the docs, which I find extremly hard to understand:

auto csvReader(Contents = string, Malformed ErrorLevel = Malformed.throwException, Range, Separator = char)(Range input, Separator delimiter = ',', Separator quote = '"')

So, let's see if I can decyphre this, step-by-step by trying out:

        csv_records = csv_data.csvReader();

Would split the CSV data into iterable CSV records using ',' char as separator using UFCS syntax. When running this I get:

std.csv.CSVException@/Library/D/dmd/src/phobos/std/csv.d(1283): Row 1's length 0 does not match previous length of 1.

Which indicates some problem because not all fields are set in my CSV data. So let's ignore any error by specifying Malformed.ignore;

        csv_records = csv_data.csvReader(Malformed.ignore);

And now I'm lost (just showing the first candidate):

Error: template std.csv.csvReader cannot deduce function from argument types !()(Result, Malformed), candidates are: /Library/D/dmd/src/phobos/std/csv.d(327): csvReader(Contents = string, Malformed ErrorLevel = Malformed.throwException, Range, Separator = char)(Range input, Separator delimiter = ',', Separator quote = '"')
 with Contents = string,
      ErrorLevel = cast(Malformed)1,
      Range = Result,
      Separator = Malformed
 whose parameters have the following constraints:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   isInputRange!Range
   is(Unqual!(ElementType!Range) == dchar)
 > isSomeChar!Separator
 - !is(Contents T : T[U], U : string)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The docs state Malformed as 2nd parameter, since I use UFCS I assume that this becomes the first parameter. I don't understand what the 3rd parameter (Range) is about. 4th parameter is my separator, which I need to set to ';' somehow.

But from the error message, it looks like DMD tries to use Malformed.ignore as the 4th (!!) Parameter being the Separator.

I'm totally confused:

* What is used as the 3rd parameter by DMD? Where does it come from?
* How to specify a ';' separator?

This is all pretty confusing...

--
Robert M. Münch
http://www.saphirion.com
smarter | better | faster

Reply via email to