(* csv.ml - comma separated values parser
*
- * $Id: csv.ml,v 1.14 2006-11-24 15:49:24 rich Exp $
+ * $Id: csv.ml,v 1.15 2008-10-27 21:57:48 rich Exp $
*)
(* The format of CSV files:
let remove_left_col =
List.map (function [] -> [] | x :: xs -> xs) in
let rec loop csv =
- if empty_left_col csv then (
- let csv = remove_left_col csv in
- loop csv
- ) else csv
+ if empty_left_col csv then
+ remove_left_col csv
+ else
+ csv
in
let csv = if left then loop csv else csv in
(* Handy tool for managing CSV files.
- * $Id: csvtool.ml,v 1.10 2006-12-05 22:40:38 rich Exp $
+ * $Id: csvtool.ml,v 1.11 2008-10-27 21:57:48 rich Exp $
*)
open Printf
) csv in
save_out ~separator:output_sep chan csv
+let rec cmd_trim ~input_sep ~output_sep ~chan (top, left, right, bottom) files =
+ let csv = List.concat (List.map (load ~separator:input_sep) files) in
+ let csv = trim ~top ~left ~right ~bottom csv in
+ save_out ~separator:output_sep chan csv
+
+and trim_flags flags =
+ let set c =
+ try ignore (String.index flags c); true with Not_found -> false
+ in
+ let top = set 't' in
+ let left = set 'l' in
+ let right = set 'r' in
+ let bottom = set 'b' in
+ (top, left, right, bottom)
+
(* Process the arguments. *)
let usage =
"csvtool - Copyright (C) 2005-2006 Richard W.M. Jones, Merjis Ltd.
Example: csvtool square input.csv > input-square.csv
+ trim [tlrb]+
+ Trim empty cells at the top/left/right/bottom of the CSV file.
+
+ Example:
+ csvtool trim t input.csv # trims empty rows at the top only
+ csvtool trim tb input.csv # trims empty rows at the top & bottom
+ csvtool trim lr input.csv # trims empty columns at left & right
+ csvtool trim tlrb input.csv # trims empty rows/columns all around
+
sub r c rows cols
Take a square subset of the CSV, top left at row r, column c, which
is rows deep and cols wide. 'r' and 'c' count from 1, or
cmd_drop ~input_sep ~output_sep ~chan rows files
| "call" :: command :: files ->
cmd_call ~input_sep ~output_sep ~chan command files
+ | "trim" :: flags :: files ->
+ let flags = trim_flags flags in
+ cmd_trim ~input_sep ~output_sep ~chan flags files
| _ ->
prerr_endline (Sys.executable_name ^ " --help for usage");
exit 2