Delimited_kernel.ReadRow up to the error, and the field with the error up to the point of failure. Same as Expert.Parse_state.Bad_csv_formatting.
This provides an applicative interface for constructing values from a csv file.
An 'a t describes how to build an OCaml model 'a for each row.
Simple example:
type t =
{ foo : int
; bar : string
}
(* Describes how to generate a [t] from a row of a csv file *)
let parse : t Delimited_kernel.Read.t =
let open Delimited_kernel.Read.Let_syntax in
let%map_open foo = at_header "foo" ~f:Int.of_string
and bar = at_header "bar" ~f:String.of_string in
{ foo; bar }
;;
let _ =
Delimited_kernel.Read.list_of_string
~header:`Yes
parse
"foo,bar\n2,\"hello, world\"\n"
;;include Core.Applicative.S with type 'a t := 'a tval return : 'a 'p 'q. 'a -> 'a tConvert a value to a t.
Applies the functions in one t to the values in another. Well-behaved applicatives satisfy these "laws", using <*> as infix apply:
return Fn.id <*> t is equivalent to treturn Fn.compose <*> tf <*> tg <*> tx is equivalent to tf <*> (tg <*> tx)return f <*> return x is equivalent to return (f x)tf <*> return x is equivalent to return (fun f -> f x) <*> tfCombines values in two ts as tuples. Using <*> as infix apply, equivalent to return (fun a b -> a, b) <*> ta <*> tb.
Transforms the contents of a t. Using <*> as infix apply, equivalent to return f <*> t.
Combines the contents of two ts. Using <*> as infix apply, equivalent to return f <*> ta <*> tb.
Combines the contents of three ts. Using <*> as infix apply, equivalent to return f <*> ta <*> tb <*> tc.
module Applicative_infix : sig ... endmodule Open_on_rhs_intf : sig ... endinclude Core.Applicative.Let_syntax
with type 'a t := 'a t
with module Open_on_rhs_intf := Open_on_rhs_intfmodule Let_syntax : sig ... endval at_index : int -> f:(string -> 'a) -> 'a tRead a field at the given index. Use f to convert the field from string.
val at_header : string -> f:(string -> 'a) -> 'a tRead a field at the given header. Use f to convert the field from string.
Note that if the given header is not provided through either the file or the ~header argument to the parsers, this will fail at runtime.
val at_header_opt : string -> f:(string option -> 'a) -> 'a tRead a field at the given header, if it exists. Use f to convert the field from string.
val label : 'a t -> Core.Info.t -> 'a tProvide a label to be used in exceptions raised by this builder
module Record_builder : Record_builder.S with type 'a applicative = 'a tmodule Fields_O : sig ... endThe following are convenience functions that build on Record_builder.field to make it easy to define a t Delimited.Read.t for some record type t.
module On_invalid_row : sig ... endmodule Header : sig ... endHeader parsing control
module Row : sig ... endWhole-row parsing.
val fold_string :
?strip:bool ->
?sep:char ->
?quote:[ `No_quoting | `Using of char ] ->
?header:Header.t ->
?on_invalid_row:'a On_invalid_row.t ->
'a t ->
init:'b ->
f:('b -> 'a -> 'b) ->
string ->
'bFold the CSV rows contained in the given string.
val list_of_string :
?strip:bool ->
?sep:char ->
?quote:[ `No_quoting | `Using of char ] ->
?header:Header.t ->
?on_invalid_row:'a On_invalid_row.t ->
'a t ->
string ->
'a listLoad the CSV as a list
val read_lines :
?strip:bool ->
?sep:char ->
?quote:[ `No_quoting | `Using of char ] ->
?header:Header.t ->
?on_invalid_row:'a On_invalid_row.t ->
'a t ->
Core.In_channel.t ->
'a listRead CSV file.
val fold_lines :
?buffer_size:int ->
?strip:bool ->
?sep:char ->
?quote:[ `No_quoting | `Using of char ] ->
?header:Header.t ->
?on_invalid_row:'a On_invalid_row.t ->
'a t ->
init:'b ->
f:('b -> 'a -> 'b) ->
Core.In_channel.t ->
'bRead CSV file, processing line by line.
module Streaming : sig ... endmodule Expert : sig ... endExperts only. If you really think you need a function in this module, please talk to a delimited dev first.