No to w takim razie przy tej definicji 'dokladnosci' to co ja pokazalem jest dobre - gdzie linia laczaca wyniki 2 odczytow zmienia kierunek z rosnacego na malejacy tam masz 'ekstremum' 
Moze 'zleceniodawca' chce przemyslec jeszcze raz specyfikacje? Gdybys mial to opisane funkcja matematyczna (a nie danymi empirycznymi z aparatury) to mialbys ekstrema/max w tych wlasnie punktach. Zaraz wrzuce kod - mam na drugim kompie.
EDIT:
no to lecimy z kodem
Kod:
#!/usr/bin/perl
use strict;
use warnings;
use Time::Local;
# tutaj bedziemy miec komplet danych - lista list - efektywnie 2-wymiarowa :-)
my @dane;
my $INFILE = $ARGV[0] || 'curves.txt'; # jesli nie mamy podanego pliku to domyslnie bedzie curves.txt
open (IN,$INFILE) || die "Nie moge otworzyc pliku $INFILE: $!\n";
chomp(my @input = <IN>); #wczytaj plik i usun znaki konca linii
close (IN);
# nie potrzebujemy licznika linnii bo to nie ma sensu - po prostu sprawdzamy czy linia ma odpowiedni format
# to co nie pasuje pomijamy, to co pasuje mielimy matematycznie :-]
foreach (@input) {
next if !/^\d{2}-\d{2}-\d{2};\d{2}:\d{2}:\d{2};/; # pomijamy te bez daty i godziny na poczatku linii
s/,/./g; # zmieniamy notacje
s/\s+//g; # wywalamy spacje
my @tmp = split/;/; # tutaj mamy kolejne pola z obrabianej linii
# najpierw przekonwertujmy date i godzine na timestamp, polaczymy w ten sposob pierwsze dwa pola uzywajac
# timelocal($sec,$min,$hour,$mday,$mon,$year)
my $timestamp = timelocal(reverse(split(/:/,$tmp[1])), reverse(split(/-/,$tmp[0])));
# pola 4 do 11 to nasze dane w kolumnach 01 do 08 ale reszte pol chcemy zostawic, pozbywajac sie tylko kolumn
# ktore nie maja nazw i zawieraja L i H - cokolwiek by to nie bylo, tniemy razem z data i godzina bo to juz mamy
for (1..4) { shift @tmp };
# skladamy calosc w jedna liste/tabele dopisujac ja na koncu macierzy - doslownie listy list (2-wymiarowa macierz)
unshift @tmp, $timestamp;
$dane[++$#dane] = \@tmp;
# jesli wszystko poszlo jak trzeba to powinnismy miec 1 nowy wiersz zawierajacy timestamp, dane, numer kolejny, pole kontrolne
}
# teraz mozemy sprawdzic jak nasze dane wygladaja w postaci przyjaznej dla oka
# zakomentuj ponizsze 2 linie jesli nie chcesz tego widziec :)
#use Data::Dumper;
#print Dumper \@dane;
#
for my $kolumna (1..8) {
# lecimy kolumnami... 0 to timestamp, 1 do 8 to dane, 9 i 10 to ostatnie 2 pola
my $poprzednia = 0;
my $ostatnie_max_indeks = 0;
# profilaktycznie kasujemy stary plik z wynikami
unlink sprintf("max_%02d_%s", $kolumna, $INFILE);
# teraz jazda z danymi
for (my $wiersz = 0; $wiersz<=$#dane; $wiersz++) {
if ($poprzednia > $dane[$wiersz]) {
# jesli wartosc aktualna jest mniejsza od poprzedniej to poprzednia linia ma lokalne maksimum
# to mozna rozbudowac na sprawdzanie wiecej niz 1 linii i w ten sposob 'wygladzic' wyniki
open (OUT, ">>", sprintf("max_%02d_%s", $kolumna, $INFILE)) || die "Nie moge otworzyc pliku do zapisu: $!\n";
print OUT "$dane[$wiersz-1][9] $dane[$wiersz-1][0] ", $dane[$wiersz-1][0] - $dane[$ostatnie_max_indeks][0], "\n";
close (OUT);
$ostatnie_max_indeks = $wiersz-1;
}
$poprzednia = $dane[$wiersz];
}
}