-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsv.py
81 lines (63 loc) · 1.62 KB
/
csv.py
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
def parse(names, line):
result = {}
ci = 0
s = ''
i = 0
while i < len(line):
c = line[i]
if c == ',':
result[names[ci]] = s
ci += 1
s = ''
i += 1
continue
if c == '"':
i += 1
while i < len(line):
c = line[i]
if c == '"':
if i + 1 < len(line) and line[i + 1] == '"':
s += '"'
i += 2
continue
else:
i += 1
break
s += c
i += 1
continue
s += c
i += 1
result[names[ci]] = s
return result
class DictReader:
def __init__(self, f):
s = f.readline()
# utf-8 BOM
if s.startswith('\ufeff'):
s = s[1:]
s = s.strip()
self.names = s.split(',')
self.rows = []
self.rowIndex = 0
while True:
line = f.readline()
if not line:
break
line = line.strip()
if (len(line) == 0):
continue
self.rows.append(parse(self.names, line))
def __iter__(self):
return self
def __next__(self):
if self.rowIndex >= len(self.rows):
raise StopIteration
row = self.rows[self.rowIndex]
self.rowIndex += 1
return row
class CSVLine:
def __init__(self, s):
self.names = s.split(',')
def parse(self, line):
return parse(self.names, line)