Function std.csv.csvReader
Returns an input range
for iterating over records found in input.
						
				auto csvReader(Contents, Malformed ErrorLevel = Malformed
				  Range input,
				
				  Separator delimiter = ',',
				
				  Separator quote = '"',
				
				  bool allowInconsistentDelimiterCount = false
				
				)
				
				if (isInputRange!Range && is(immutable(ElementType!Range) == immutable(dchar)) && isSomeChar!Separator && !is(Contents T : T[U], U : string));
				
				
				auto csvReader(Contents, Malformed ErrorLevel = Malformed
				  Range input,
				
				  Header header,
				
				  Separator delimiter = ',',
				
				  Separator quote = '"',
				
				  bool allowInconsistentDelimiterCount = false
				
				)
				
				if (isInputRange!Range && is(immutable(ElementType!Range) == immutable(dchar)) && isSomeChar!Separator && isForwardRange!Header && isSomeString!(ElementType!Header));
				
				
				auto csvReader(Contents, Malformed ErrorLevel = Malformed
				  Range input,
				
				  Header header,
				
				  Separator delimiter = ',',
				
				  Separator quote = '"',
				
				  bool allowInconsistentDelimiterCount = false
				
				)
				
				if (isInputRange!Range && is(immutable(ElementType!Range) == immutable(dchar)) && isSomeChar!Separator && is(Header : typeof(null)));
						
					
				An optional header can be provided. The first record will be read in
as the header. If Contents is a struct then the header provided is
expected to correspond to the fields in the struct. When Contents is
not a type which can contain the entire record, the header must be
provided in the same order as the input or an exception is thrown.
Returns
An input range R as defined by
       isInputRange. When Contents is a
       struct, class, or an associative array, the element type of R is
       Contents, otherwise the element type of R is itself a range with
       element type Contents.
       If a header argument is provided,
       the returned range provides a header field for accessing the header
       from the input in array form.
Throws
CSVException When a quote is found in an unquoted field,
      data continues after a closing quote, the quoted field was not
      closed before data was empty, a conversion failed, or when the row's
      length does not match the previous length.
      HeaderMismatchException  when a header is provided but a
      matching column is not found or the order did not match that found in
      the input. Read the exception documentation for specific details of
      when the exception is thrown for different types of Contents.
Example
The Contents of the input can be provided if all the records are the
same type such as all integer data:
import stdExample
Using a struct with modified delimiter:
import stdExample
Specifying ErrorLevel as Malformed will lift restrictions
on the format. This example shows that an exception is not thrown when
finding a quote in a field not quoted.
string text = "A \" is now part of the data";
auto records = textExample
Read only column "b"
import stdExample
Read while rearranging the columns by specifying a header with a different order"
import stdExample
The header can also be left empty if the input contains a header row
and all columns should be iterated.
The header from the input can always be accessed from the header field.
string text = "a,b,c\nHello,65,63.63";
auto records = textExample
Handcrafted csv files tend to have an variable amount of columns.
By default std will throw if the number of columns on a line
is unequal to the number of columns of the first line.
To allow, or disallow, a variable amount of columns a bool can be passed to
all overloads of the csvReader function as shown below.
import stdExample
ditto
import stdExample
ditto
import stdAuthors
Jesse Phillips