in reply to Funky date question.

I can imagine you have a problem determining that. I have too. Look at your example. In the first two lines, the same ID is opened twice. Then it's put on hold twice, and opened again, to be put on hold for a third time.

Confusing, isn't? What you really need is some kind of state diagram, and transistions how IDs can change from state to state. Then decide which states are "open" (probably after they are opened, and no after they are closed - but what if they are on hold?). Also, from your explaination, it isn't at all clear what "hold" means. How does an ID get out of a hold state?

Once you can define your problem in clear, unambigious terms, the solution you are asking is likely to be clear to you too. But currently, people can only guess what you mean - present solutions matching their guess, but you won't know. You have to guess too, and that's likely to result in a lot of wasted efford.

-- Abigail

Replies are listed 'Best First'.
Re: Funky date question.
by Abigail (Deacon) on Jun 10, 2001 at 02:51 UTC
    Having read the thread another time, I think I kind of understand what you want to do.

    Here's what I think:

    You have a log file, three fields per record, one record per line. First field is a timestamp, second field an ID or case number, last field a transistion of the case. Valid states are "open", "hold" and "closed". You want to sum, for each case, the time the case is "open", that is, neither "closed", nor on "hold".

    I've some untested partial code to do this. It's important to note that for this calculation, "hold" and "closed" are equivalent. Only relevant states are "open" and non-"open". The code assumes a parse_me subroutine that parses a line, and returns three values: a timestamp in seconds since some epoch, a case ID, and a state.

    my %info; while (<>) { my ($time, $id, $state) = parse_me ($_); unless ($info {$id}) { next unless $state eq 'open'; $info {$id} = [$state, $time, 0]; next; } if ($state eq 'open') { next unless $info {$id} -> [0] eq 'open'; $info {$id} -> [0] = 'open'; $info {$id} -> [1] = $time; next; } next unless $info {$id} -> [0] eq 'open'; # This means the previous state was "open", and the current # state is "hold" or "closed". Increment the time. $info {$id} -> [2] += $time - $info {$id} -> [1]; $info {$id} -> [0] = $state; $info {$id} -> [1] = $time; # Not really needed. } # Finally, for all "open" cases, add the time since it went # "open" till now. my $time = time; while (my ($id, $info) = each %info) { next unless $info -> [0] eq 'open'; $info -> [2] += $time - $info -> [1]; }
    Now, for each ID, the total open time is found in $info {$ID} -> [2].

    -- Abigail