anchor.diff:      % ?LogDebug("select UnquotedFN ~p",[UnquotedFN]),
       {ok, Io} = file:open(UnquotedFN, [raw, read, binary]),
       CsvOpts = file_info(UnquotedFN, schema_to_opts(Schema)),
  -    ?LogDebug("CSV Schema Opts : ~p", [CsvOpts]),    
  -    read_blocks(Io, 0, ?CSV_INFO_BYTES, RowLimit, CsvOpts).
  -
  -select(#{io := Io, pos := Pos, blockSize := BlockSize, rowLimit := RowLimit, opts := CsvOpts}) ->
  -    read_blocks(Io, Pos, BlockSize, RowLimit, CsvOpts).
  -
  -read_blocks(Io, Pos, BlockSize, RowLimit, CsvOpts) ->
  -    read_blocks(Io, Pos, BlockSize, RowLimit, CsvOpts, []).
  -
  -read_blocks(Io, Pos, BlockSize, RowLimit, CsvOpts, Rows) -> 
  +    ?LogDebug("CSV Schema Opts : ~p", [CsvOpts]),
  +    read_blocks(Io, UnquotedFN, 0, ?CSV_INFO_BYTES, RowLimit, 0, CsvOpts).
  +
  +select(#{io := Io, file:= File, pos := Pos, blockSize := BlockSize, rowLimit := RowLimit, rowsSkipped := RowsSkipped, opts := CsvOpts}) ->
  +    read_blocks(Io, File, Pos, BlockSize, RowLimit, RowsSkipped, CsvOpts).
  +
  +read_blocks(Io, File, Pos, BlockSize, RowLimit, RowsSkipped, CsvOpts) ->
  +    read_blocks(Io, File, Pos, BlockSize, RowLimit, RowsSkipped, CsvOpts, []).
  +
  +read_blocks(Io, File, Pos, BlockSize, RowLimit, RowsSkipped, CsvOpts, Rows) -> 
       #{ lineSeparator := LineSeparator
        , columnSeparator := ColumnSeparator
        , columnCount := ColumnCount
        , columns := _Columns
        , header := _Header
        , encoding := _Encoding
  +     , skip := Skip
        } = CsvOpts,
       LSL = byte_size(LineSeparator),
       case file:pread(Io, Pos, BlockSize) of
  
positive.code:                                , {<<"utf8">>,encoding,utf8}
                                 , {<<"ansi">>,encoding,ansi}
                                 % , {<<"123">>,columnCount,123}  % specially treated
                                 ]).
  
  % gen_server
  
negative.code: schema_to_opts(Schema) when is_binary(Schema) ->
      schema_to_opts( binary:split(Schema, <<"$">>, [global]) -- [?CSV_SCHEMA,<<>>], #{}).
  
  schema_to_opts([], #{skip := _} = Opts) -> Opts;
  schema_to_opts([], Opts) -> Opts#{skip => 0};
  schema_to_opts([Token|Tokens], Opts) ->
      case (catch list_to_integer(binary_to_list(Token))) of
          N when is_integer(N) ->
              schema_to_opts(Tokens, Opts#{columnCount => N});
          _ ->
              case Token of
                  <<"skip",Skip/binary>> ->
                      case (catch list_to_integer(binary_to_list(Skip))) of
                          S when is_integer(S) ->
                              schema_to_opts(Tokens, Opts#{skip => S});
                          _ ->
                              ?ClientErrorNoLogging({"Invalid CSV skip number",Token})
                      end;
                  _ ->
                      case lists:key_find(Token, 1, ?ALL_CSV_SCHEMA_TOKENS) of
                          {Token,Key,Value} ->  
                              schema_to_opts(Tokens, Opts#{Key => Value});
                          _ ->
                              ?ClientErrorNoLogging({"Invalid CSV schema token",Token})
                      end
              end
      end.
  
  