68 lines
2.7 KiB
Plaintext
68 lines
2.7 KiB
Plaintext
let input_line ic =
|
|
try Some(input_line ic)
|
|
with End_of_file -> None
|
|
|
|
let fold_input f ini ic =
|
|
let rec fold ac =
|
|
match input_line ic with
|
|
| Some line -> fold (f ac line)
|
|
| None -> ac
|
|
in
|
|
fold ini
|
|
|
|
let ic = open_in "readings.txt"
|
|
|
|
let scan line =
|
|
Scanf.sscanf line "%s\
|
|
\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\
|
|
\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\
|
|
\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\
|
|
\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d\t%f\t%d"
|
|
(fun date
|
|
v1 f1 v2 f2 v3 f3 v4 f4 v5 f5 v6 f6
|
|
v7 f7 v8 f8 v9 f9 v10 f10 v11 f11 v12 f12
|
|
v13 f13 v14 f14 v15 f15 v16 f16 v17 f17 v18 f18
|
|
v19 f19 v20 f20 v21 f21 v22 f22 v23 f23 v24 f24 ->
|
|
(date),
|
|
[ (v1, f1 ); (v2, f2 ); (v3, f3 ); (v4, f4 ); (v5, f5 ); (v6, f6 );
|
|
(v7, f7 ); (v8, f8 ); (v9, f9 ); (v10, f10); (v11, f11); (v12, f12);
|
|
(v13, f13); (v14, f14); (v15, f15); (v16, f16); (v17, f17); (v18, f18);
|
|
(v19, f19); (v20, f20); (v21, f21); (v22, f22); (v23, f23); (v24, f24); ])
|
|
|
|
let tot_file, num_file, _, nodata_max, nodata_maxline =
|
|
fold_input
|
|
(fun (tot_file, num_file, nodata, nodata_max, nodata_maxline) line ->
|
|
let date, datas = scan line in
|
|
let _datas = List.filter (fun (_, flag) -> flag > 0) datas in
|
|
let ok = List.length _datas in
|
|
let tot = List.fold_left (fun ac (value, _) -> ac +. value) 0.0 _datas in
|
|
let nodata, nodata_max, nodata_maxline =
|
|
List.fold_left
|
|
(fun (nodata, nodata_max, nodata_maxline) (_, flag) ->
|
|
if flag <= 0
|
|
then (succ nodata, nodata_max, nodata_maxline)
|
|
else
|
|
if nodata_max = nodata && nodata > 0
|
|
then (0, nodata_max, date::nodata_maxline)
|
|
else if nodata_max < nodata && nodata > 0
|
|
then (0, nodata, [date])
|
|
else (0, nodata_max, nodata_maxline)
|
|
)
|
|
(nodata, nodata_max, nodata_maxline) datas in
|
|
Printf.printf "Line: %s" date;
|
|
Printf.printf " Reject: %2d Accept: %2d" (24 - ok) ok;
|
|
Printf.printf "\tLine_tot: %8.3f" tot;
|
|
Printf.printf "\tLine_avg: %8.3f\n" (tot /. float ok);
|
|
(tot_file +. tot, num_file + ok, nodata, nodata_max, nodata_maxline))
|
|
(0.0, 0, 0, 0, [])
|
|
ic ;;
|
|
|
|
close_in ic ;;
|
|
|
|
Printf.printf "Total = %f\n" tot_file;
|
|
Printf.printf "Readings = %d\n" num_file;
|
|
Printf.printf "Average = %f\n" (tot_file /. float num_file);
|
|
Printf.printf "Maximum run(s) of %d consecutive false readings \
|
|
ends at line starting with date(s): %s\n"
|
|
nodata_max (String.concat ", " nodata_maxline);
|