(* Handy tool for managing CSV files.
- * $Id: csvtool.ml,v 1.9 2006-12-05 22:24:44 rich Exp $
+ * $Id: csvtool.ml,v 1.11 2008-10-27 21:57:48 rich Exp $
*)
open Printf
in
List.iter (
fun filename ->
- let in_chan = open_in filename in
+ let in_chan, close =
+ match filename with
+ | "-" -> stdin, false
+ | filename -> open_in filename, true in
load_rows ~separator:input_sep f in_chan;
- close_in in_chan
+ if close then close_in in_chan
) files
let rec uniq = function
) 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