X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;ds=sidebyside;f=csv.ml;h=0ff03710b43a2440be9845d23bcbad63279868b4;hb=f6dbacda332fa9a11a36b3424516409d387058a1;hp=1c0ae62845c75caa33693628a8f6394d7c81a11a;hpb=a2444ad5c216e0d1b667f7072bc203956abe48ef;p=ocaml-csv.git diff --git a/csv.ml b/csv.ml index 1c0ae62..0ff0371 100644 --- a/csv.ml +++ b/csv.ml @@ -1,6 +1,6 @@ (* csv.ml - comma separated values parser * - * $Id: csv.ml,v 1.6 2005-08-13 10:10:31 rich Exp $ + * $Id: csv.ml,v 1.7 2005-11-25 14:06:58 rich Exp $ *) (* The format of CSV files: @@ -49,6 +49,15 @@ let rec dropwhile f = function | x :: xs when f x -> dropwhile f xs | xs -> xs +(* from extlib: *) +let rec drop n = function + | _ :: l when n > 0 -> drop (n-1) l + | l -> l + +let rec take n = function + | x :: xs when n > 0 -> x :: take (pred n) xs + | _ -> [] + let lines = List.length let columns csv = @@ -221,6 +230,47 @@ let square csv = List.rev row ) csv +let is_square csv = + let columns = columns csv in + List.for_all (fun row -> List.length row = columns) csv + +let rec set_columns cols = function + | [] -> [] + | r :: rs -> + let rec loop i cells = + if i < cols then ( + match cells with + | [] -> "" :: loop (succ i) [] + | c :: cs -> c :: loop (succ i) cs + ) + else [] + in + loop 0 r :: set_columns cols rs + +let rec set_rows rows csv = + if rows > 0 then ( + match csv with + | [] -> [] :: set_rows (pred rows) [] + | r :: rs -> r :: set_rows (pred rows) rs + ) + else [] + +let set_size rows cols csv = + set_columns cols (set_rows rows csv) + +let sub r c rows cols csv = + let csv = drop r csv in + let csv = List.map (drop c) csv in + let csv = set_rows rows csv in + let csv = set_columns cols csv in + csv + +let to_array csv = + Array.of_list (List.map Array.of_list csv) + +let of_array csv = + List.map Array.to_list (Array.to_list csv) + let associate header data = let nr_cols = List.length header in let rec trunc = function