csv.lua

Fri, 26 Mar 2010 01:30:24 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Fri, 26 Mar 2010 01:30:24 +0000
changeset 0
0e2b5dc7ae34
child 3
5b24d66365ec
permissions
-rw-r--r--

Initial commit

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

mercurial