Text processing/1: Difference between revisions
Content added Content deleted
Line 782: | Line 782: | ||
Maximum number of consecutive bad readings is 589 |
Maximum number of consecutive bad readings is 589 |
||
Ends on date 1993-03-05</pre> |
Ends on date 1993-03-05</pre> |
||
=={{header|Clojure}}== |
|||
<lang Clojure> |
|||
(ns rosettacode.textprocessing1 |
|||
(:require [clojure.string :as str])) |
|||
(defn parse-line [s] |
|||
(let [[date & data-toks] (str/split s #"\s+")] |
|||
{:date date |
|||
:hour-vals (for [[v flag] (partition 2 data-toks)] |
|||
{:val (Double. v) |
|||
:flag (Long. flag)})})) |
|||
(defn analyze-line [m] |
|||
(let [valid? (fn [rec] (pos? (:flag rec))) |
|||
data (->> (filter valid? (:hour-vals m)) |
|||
(map :val)) |
|||
n-vals (count data) |
|||
sum (reduce + data)] |
|||
{:date (:date m) |
|||
:n-vals n-vals |
|||
:sum (double sum) |
|||
:avg (if (zero? n-vals) 0.0 (/ sum n-vals)) |
|||
:gaps (for [hr (:hour-vals m)] |
|||
{:gap? (not (valid? hr)) :date (:date m)})})) |
|||
(defn print-line [m] |
|||
(println (format "%s: %d valid, sum: %7.3f, mean: %6.3f" |
|||
(:date m) |
|||
(:n-vals m) |
|||
(:sum m) |
|||
(:avg m)))) |
|||
(defn process-line [s] |
|||
(let [m (parse-line s) |
|||
line-info (analyze-line m)] |
|||
(print-line line-info) |
|||
line-info)) |
|||
(defn update-file-stats [file-m line-m] |
|||
(let [append (fn [a b] (reduce conj a b))] |
|||
(-> file-m |
|||
(update-in [:sum] + (:sum line-m)) |
|||
(update-in [:n-vals] + (:n-vals line-m)) |
|||
(update-in [:gap-recs] append (:gaps line-m))))) |
|||
(defn process-file [path] |
|||
(let [file-lines (->> (slurp path) |
|||
str/split-lines) |
|||
summary (reduce (fn [res line] |
|||
(update-file-stats res (process-line line))) |
|||
{:sum 0 |
|||
:n-vals 0 |
|||
:gap-recs []} |
|||
file-lines) |
|||
max-gap (->> (partition-by :gap? (:gap-recs summary)) |
|||
(filter #(:gap? (first %))) |
|||
(sort-by count >) |
|||
first)] |
|||
(println (format "Sum: %f\n# Values: %d\nAvg: %f" |
|||
(:sum summary) |
|||
(:n-vals summary) |
|||
(/ (:sum summary) (:n-vals summary)))) |
|||
(println (format "Max gap of %d recs started on %s" |
|||
(count max-gap) |
|||
(:date (first max-gap)))))) |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
... Many lines elided ... |
|||
2004-12-24: 23 valid, sum: 67.500, mean: 2.935 |
|||
2004-12-25: 23 valid, sum: 137.500, mean: 5.978 |
|||
2004-12-26: 23 valid, sum: 154.600, mean: 6.722 |
|||
2004-12-27: 23 valid, sum: 57.100, mean: 2.483 |
|||
2004-12-28: 23 valid, sum: 77.800, mean: 3.383 |
|||
2004-12-29: 23 valid, sum: 56.300, mean: 2.448 |
|||
2004-12-30: 23 valid, sum: 65.300, mean: 2.839 |
|||
2004-12-31: 23 valid, sum: 47.300, mean: 2.057 |
|||
Sum: 1358393.400000 |
|||
# Values: 129403 |
|||
Avg: 10.497387 |
|||
Max gap of 589 recs started on 1993-02-09 |
|||
</pre> |
|||
=={{header|COBOL}}== |
=={{header|COBOL}}== |