-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathcsv.lua
More file actions
108 lines (102 loc) · 1.64 KB
/
Copy pathcsv.lua
File metadata and controls
108 lines (102 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
local function parseCSV(s)
result = {}
row = {}
cell = ""
quoted = false
prevQuote = false
for i = 1, #s, 1 do
c = s:sub(i, i)
if quoted then
if c == '"' then
prevQuote = true
quoted = false
else
cell = cell .. c
end
else
if c == '"' then
if #cell == 0 then
quoted = true
else
if prevQuote then
cell = cell .. '"'
quoted = true
prevQuote = false
else
return false
end
end
elseif c == "," then
table.insert(row, cell)
cell = ""
prevQuote = false
elseif c == "\n" then
table.insert(row, cell)
cell = ""
table.insert(result, row)
row = {}
prevQuote = false
else
if prevQuote then
return false
end
cell = cell .. c
end
end
end
if #cell ~= 0 then
if quoted then
return false
end
table.insert(row, cell)
table.insert(result, row)
end
return result
end
local function test()
local p = function(s)
print(require("serialization").serialize(s))
end
p(parseCSV(
[[
aaa,bbb,ccc,ddd
eee,fff,ggg,hhh
]]
))
p(parseCSV(
[[
aaa,bbb,ccc,ddd
eee,fff,ggg,hhh]]
))
p(parseCSV(
[[
aaa,bbb,ccc,"ddd
eee",fff,ggg,hhh]]
))
p(parseCSV(
[[
aaa,bbb,c"cc,ddd
eee,fff,ggg,hhh]]
))
p(parseCSV(
[[
aaa,bbb,"ccc,ddd
eee,fff,ggg,hhh]]
))
p(parseCSV(
[[
aaa,bbb,"cc"c,ddd
eee,fff,ggg,hhh]]
))
p(parseCSV(
[[
aaa,bbb,"cc""c,ddd
eee,fff,ggg,hhh]]
))
p(parseCSV(
[[
aaa,bbb,"cc""c",ddd
eee,fff,ggg,hhh]]
))
end
return parseCSV