74 lines
1.8 KiB
OCaml
74 lines
1.8 KiB
OCaml
type data =
|
|
| Columns of column list
|
|
and column =
|
|
| Column of string * data_type * values (*name * type * value/range *)
|
|
and data_type =
|
|
| Int
|
|
| String
|
|
| Date
|
|
and values =
|
|
| Range of string * string
|
|
| Values of string list
|
|
|
|
let random_int lower_bound upper_bound =
|
|
let i = Random.int (upper_bound +1 - lower_bound) + lower_bound in
|
|
string_of_int i
|
|
|
|
let random_string values =
|
|
let len = List.length values in
|
|
let idx = Random.int len in
|
|
List.nth values idx
|
|
|
|
let generate_row column =
|
|
match column with
|
|
| Column(_, Int, Range(min, max)) ->
|
|
let lower_bound = int_of_string min in
|
|
let upper_bound = int_of_string max in
|
|
random_int lower_bound upper_bound
|
|
| Column(_, String, Values(values)) ->
|
|
random_string values
|
|
| _ -> failwith "Invalid column"
|
|
|
|
let get_headers columns =
|
|
let rec aux cols =
|
|
match cols with
|
|
| [] -> []
|
|
| [Column(name, _, _)] -> [name]
|
|
| Column(name, _, _)::l -> name::(aux l)
|
|
in
|
|
match columns with
|
|
| Columns(cols) -> aux cols
|
|
|
|
|
|
let generate_rows columns n =
|
|
let aux col =
|
|
match col with
|
|
| Column(_, Int, Range(min, max)) ->
|
|
let lower_bound = int_of_string min in
|
|
let upper_bound = int_of_string max in
|
|
random_int lower_bound upper_bound
|
|
| Column(_, String, Values(values)) ->
|
|
random_string values
|
|
| _ -> failwith "Wrong column specification"
|
|
in
|
|
let rec aux1 cols =
|
|
match cols with
|
|
| [] -> []
|
|
| [col] -> [aux col]
|
|
| col :: l -> (aux col)::(aux1 l)
|
|
in
|
|
let rec aux2 cols n =
|
|
match n with
|
|
| 0 -> []
|
|
| n -> (aux1 cols)::(aux2 cols (n-1))
|
|
in
|
|
aux2 columns n
|
|
|
|
|
|
|
|
let generate_csv columns delim =
|
|
let header_list = get_headers columns in
|
|
let header = String.concat delim header_list in
|
|
print_string header
|
|
|