<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE message PUBLIC
  "-//MLarc//DTD MLarc output files//EN"
  "../../mlarc.dtd"[
  <!ATTLIST message
    listname CDATA #REQUIRED
    title CDATA #REQUIRED
  >
]>

  <?xml-stylesheet href="../../mlarc.xsl" type="text/xsl"?>


<message 
  url="2003/10/1271d8cb3491b0027667093a335ee94e"
  from="Florian Hars &lt;hars@b...&gt;"
  author="Florian Hars"
  date="2003-10-29T07:23:31"
  subject="Re: [Caml-list] newbie type problem"
  prev="2003/10/d193ec219165ecf11023420e9f1bd5c6"
  next="2003/10/d2f1b208c9d36f5626b05e92dc16d26e"
  prev-in-thread="2003/10/4046091fba633875058f2de17f0ff1e7"
  next-in-thread="2003/10/f070014a1ae9dad3251d6334d87f1555"
  prev-thread="2003/10/e7f6c0d5605db8954852475f246f1109"
  next-thread="2003/10/ef7ea5a38d2bceb896eb567f1eff1764"
  root="../../"
  period="month"
  listname="caml-list"
  title="Archives of the Caml mailing list">

<thread subject="[Caml-list] newbie type problem">
<msg 
  url="2003/10/2e8a6962baf66f1c24c5f132e0e4d98a"
  from="Dustin Sallings &lt;dustin@s...&gt;"
  author="Dustin Sallings"
  date="2003-10-24T06:11:43"
  subject="[Caml-list] newbie type problem">
<msg 
  url="2003/10/1ec46ca647143db0b89bf64b3fe444da"
  from="David Brown &lt;caml-list@d...&gt;"
  author="David Brown"
  date="2003-10-24T06:32:48"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/9e4d0c48d7066d16614195d454ef1c0d"
  from="Dustin Sallings &lt;dustin@s...&gt;"
  author="Dustin Sallings"
  date="2003-10-24T06:54:14"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/082653152d78e76edce7de62398f8c1f"
  from="David Brown &lt;caml-list@d...&gt;"
  author="David Brown"
  date="2003-10-24T07:53:03"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/a7c47b1fe652cbc379e868c63cd6fa6f"
  from="Dustin Sallings &lt;dustin@s...&gt;"
  author="Dustin Sallings"
  date="2003-10-24T08:21:36"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/f70a630abcb73995f40868e5b4aedd5d"
  from="Andrew Lenharth &lt;andrewl@d...&gt;"
  author="Andrew Lenharth"
  date="2003-10-24T12:50:08"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/4046091fba633875058f2de17f0ff1e7"
  from="Remi Vanicat &lt;vanicat@l...&gt;"
  author="Remi Vanicat"
  date="2003-10-24T13:21:26"
  subject="Re: [Caml-list] newbie type problem">
</msg>
</msg>
<msg 
  url="2003/10/1271d8cb3491b0027667093a335ee94e"
  from="Florian Hars &lt;hars@b...&gt;"
  author="Florian Hars"
  date="2003-10-29T07:23:31"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/f070014a1ae9dad3251d6334d87f1555"
  from="Dustin Sallings &lt;dustin@s...&gt;"
  author="Dustin Sallings"
  date="2003-10-29T08:03:55"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/669fd0c0dff2b0a039406b7cb928916d"
  from="Florian Hars &lt;hars@b...&gt;"
  author="Florian Hars"
  date="2003-10-29T16:27:29"
  subject="Re: [Caml-list] newbie type problem">
</msg>
</msg>
</msg>
</msg>
</msg>
<msg 
  url="2003/10/bc22b36f43b4dd5f6d7af456fd0801fc"
  from="Hendrik Tews &lt;tews@t...&gt;"
  author="Hendrik Tews"
  date="2003-10-24T09:25:16"
  subject="Re: [Caml-list] newbie type problem">
<msg 
  url="2003/10/196dea4817e90f7281ee0ccc73dd15a7"
  from="Dustin Sallings &lt;dustin@s...&gt;"
  author="Dustin Sallings"
  date="2003-10-24T16:23:13"
  subject="Re: [Caml-list] newbie type problem">
</msg>
</msg>
</msg>
</msg>
</msg>
</thread>

<contents>
Dustin Sallings wrote:
&gt;     Well, part of the problem is that my log files aren't necessarily 
&gt; sequential, so I have to be able to go back to any point in time and 
&gt; update the thing.

Last time I had that problem I used two structures: one to keep the open events 
that come in from the logfiles and one to keep the data for the complete 
transactions where I have read all the relevant events.
If your logfiles are line-oriented (as these critters tend to be), you might 
want to write a function thats folds a function over all lines of a text file.
Then your program will look something like (add error checking, logic for 
handling overlapping transactions of the same type and missing functions to taste):

type evt = Start of string * float | End of string * float | Junk

module M = Map.make (struct type t = string let compare = compare end)

let parse_line s =
   if is_start s then
     Start (get_transaction_type s, get_time_form_log_line s)
   else if is_end s then
     End (get_transaction_type s, get_time_from_log_line s)
   else
      Junk

let operate_on_line (start_events, transactions as init) s =
   match parse_line s with
   | Junk -&gt; init
   | Start (t_type, time) -&gt;
         M.add t_type time start_events, transactions
   | End (t_type, time) -&gt;
	let start_time = M.find t_type start_events in
	let l = try M.find t_type transactions with Not_found -&gt; [] in
         M.remove t_type start_events,
         M.add t_type ((time - start_time)::l) transactions

let parse_logfile filename =
   let ic = open_in filename in
   let start_events, transactions =
     Textfile.fold operate_on_line (M.empty, M.empty) ic in
   close_in ic;
   cleanup_dangling_events start_events transactions

let _ = print_transaction_info (parse_logfile "my_logfile")

Yours, Florian.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners

</contents>

</message>

