tsv.lua

Sat, 31 Oct 2009 16:28:31 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sat, 31 Oct 2009 16:28:31 +0000
changeset 0
fc93ff84350d
permissions
-rw-r--r--

Initial commit

0
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local lpeg = require "lpeg"
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local setmetatable, tonumber =
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 setmetatable, tonumber;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local s_char = string.char;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 module("tsv");
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local delim = lpeg.P"\t";
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local char_escape = lpeg.R"az" + lpeg.S"\\\r\n" + delim;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local numeric_escape = (lpeg.R"09"^1)^-3;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local escape = (lpeg.P"\\" * (char_escape + numeric_escape));
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local value = (escape + (1-delim))^0;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local escape_map = setmetatable({
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 t = "\t", b = "\b", f = "\f";
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 n = "\n", r = "\r", v = "\v"; },
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 { __index = function (_, n)
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 if tonumber(n) then
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 print"n"
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 return s_char(tonumber(n));
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 else
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 return n;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 end
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 end
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 });
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 function read_record(line, value_callback)
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 local fieldpos = 0;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local callback = function (v)
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 return value_callback(v:gsub("\\(.)", escape_map));
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 end;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 repeat
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 fieldpos = lpeg.match(value / callback, line, fieldpos+1);
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 until fieldpos >= #line;
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 end
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
fc93ff84350d Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 return _M;

mercurial