On Sep 7, 2011, at 12:16 PM, Olaf Dietsche wrote: > Rasmus <ras...@gmx.us> writes: > >>> Why don't you just use a simple (perl/python/...) script to collect your >>> data? Here's a quick hack in perl: >> >> That was my plan if I was not able to do from within Org. To me it would >> be a lot faster than hacking something together in emacs-lisp, >> unfortunately. > > If you insist on elisp, maybe something along these (untested) lines > might work: > > ---8<--- cut here --- > (defvar clockstable) > > (defun collect-clock-lines () > (org-narrow-to-subtree) > (let ((re (concat "^[ \t]*" org-clock-string "[ \t]+\\(.+?\\)[ \t]+=>[ > \t]+\\(.+\\)")) > (headline (nth 4 (org-heading-components)))) > (while (re-search-forward re) > (setq clockstable (concat clockstable (match-string 1) "|" headline "|" > (match-string 2) "\n"))))) > > (defun summarize-clocks () > (interactive) > (setq clockstable "| date | headline | total |\n|-----+----+----|\n") > (org-map-entries collect-clock-lines nil 'agenda) > (insert clockstable)) > --- cut here --->8---
Hi Olaf, this is great! Maybe we should make this a little builtin function, with a format specification to create the lines. What is still missing, I think, is some sorting by time would. Basically, use (org-float-time (apply 'encode-time (save-match-data (org-parse-time-string (match-string 1))))) after the successful search for a clock string to get a floating point number representing the starting time, collect the line you are creating into an alist with the times and sort them before inserting into the buffer. - Carsten