From: Ted Zlatanov <tzz@lifelogs.com>
To: emacs-devel@gnu.org
Subject: Re: map-file-lines
Date: Mon, 02 Feb 2009 14:48:25 -0600 [thread overview]
Message-ID: <86k5887eg6.fsf@lifelogs.com> (raw)
In-Reply-To: 86wsc87o3c.fsf@lifelogs.com
On Mon, 02 Feb 2009 11:20:07 -0600 Ted Zlatanov <tzz@lifelogs.com> wrote:
TZ> Emacs Lisp lacks a good way to iterate over all the lines of a file,
TZ> especially for a large file. The following code tries to provide a
TZ> solution, concentrating on reading a block of data in one shot and then
TZ> processing it line by line. It may be more efficient to write this in
TZ> C. Also, it does not deal with cases where the first line read is
TZ> bigger than the buffer size, and may have other bugs, but it works for
TZ> me so I thought I'd post it for comments and criticism.
Updated:
- line count 0-based now, logic is cleaner
- buffer size 128K by default
- accept start line and count
- abort when the lambda func returns nil
- renamed endline to line-end for clarity
Thanks
Ted
(defun map-file-lines (file func &optional startline count bufsize)
(let ((filepos 0)
(linenum 0)
(bufsize (or bufsize (* 128 1024))))
(with-temp-buffer
(while
(let*
((inserted (insert-file-contents
file nil
filepos (+ filepos bufsize)
t))
(numlines (count-lines (point-min) (point-max)))
(read (nth 1 inserted))
(done (< 1 read))
result line-end)
(dotimes (n (count-lines (point-min) (point-max)))
(goto-char (point-min))
(setq line-end (line-end-position)
result (if (and startline (< linenum startline))
()
(if (and
count
(>= (- linenum startline) count))
(return)
(funcall func
(buffer-substring
(line-beginning-position)
line-end)
linenum)))
done (and done result))
(incf filepos line-end)
(forward-line)
(incf linenum))
done)))
linenum))
;;(map-file-lines "/tmp/test" (lambda (line num) (message "%d: %s" num line)))
;;(map-file-lines "/tmp/test" (lambda (line num) (message "%d: %s" num line)) 100)
;;(map-file-lines "/tmp/test" (lambda (line num) (message "%d: %s" num line)) 100 10)
next prev parent reply other threads:[~2009-02-02 20:48 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-02 17:20 map-file-lines Ted Zlatanov
2009-02-02 18:54 ` map-file-lines Stefan Monnier
2009-02-02 19:22 ` map-file-lines Ted Zlatanov
2009-02-02 19:52 ` map-file-lines joakim
2009-02-02 20:54 ` map-file-lines Ted Zlatanov
2009-02-02 22:42 ` map-file-lines Stefan Monnier
2009-02-03 13:57 ` map-file-lines Ted Zlatanov
2009-02-02 22:41 ` map-file-lines Stefan Monnier
2009-02-02 23:59 ` map-file-lines joakim
2009-02-03 4:13 ` map-file-lines Stefan Monnier
2009-02-03 7:27 ` map-file-lines joakim
2009-02-03 14:50 ` map-file-lines Stefan Monnier
2009-02-04 7:04 ` map-file-lines Richard M Stallman
2009-02-04 15:38 ` map-file-lines Ted Zlatanov
2009-02-05 5:40 ` map-file-lines Richard M Stallman
2009-02-06 18:42 ` view/edit large files (was: map-file-lines) Ted Zlatanov
2009-02-06 21:06 ` view/edit large files Ted Zlatanov
2009-02-06 21:49 ` Miles Bader
[not found] ` <864oz3nyj8.fsf@lifelogs.com>
2009-02-10 1:58 ` Stefan Monnier
2009-02-10 8:46 ` Eli Zaretskii
2009-02-10 9:23 ` Miles Bader
2009-02-10 9:54 ` Eli Zaretskii
2009-02-10 10:02 ` Miles Bader
2009-02-10 11:50 ` Eli Zaretskii
2009-02-10 15:08 ` Ted Zlatanov
2009-02-17 19:23 ` Stefan Monnier
2009-02-17 19:47 ` Eli Zaretskii
2009-02-17 20:18 ` Miles Bader
2009-02-17 20:51 ` Eli Zaretskii
2009-02-17 21:19 ` Miles Bader
2009-02-17 21:21 ` Miles Bader
2009-02-18 4:09 ` Eli Zaretskii
2009-02-18 1:56 ` Stefan Monnier
2009-02-20 19:23 ` Ted Zlatanov
2009-02-10 12:28 ` Eli Zaretskii
2009-02-10 12:46 ` Miles Bader
2009-02-07 9:14 ` view/edit large files (was: map-file-lines) Richard M Stallman
2009-02-09 20:26 ` view/edit large files Ted Zlatanov
2009-02-10 20:02 ` Richard M Stallman
2009-02-06 13:20 ` map-file-lines Mathias Dahl
2009-02-02 22:40 ` map-file-lines Stefan Monnier
2009-02-03 4:11 ` map-file-lines Stefan Monnier
2009-02-02 20:48 ` Ted Zlatanov [this message]
2009-02-03 8:08 ` map-file-lines Thien-Thi Nguyen
2009-02-03 14:00 ` map-file-lines Ted Zlatanov
2009-02-03 14:17 ` map-file-lines Miles Bader
2009-02-03 10:45 ` map-file-lines Thierry Volpiatto
2009-02-03 14:06 ` map-file-lines Ted Zlatanov
2009-02-03 14:56 ` map-file-lines Thierry Volpiatto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86k5887eg6.fsf@lifelogs.com \
--to=tzz@lifelogs.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.