1 """
2 obitools.table.csv module provides an iterator adapter
3 allowing to parse csv (comma separatted value) file
4 """
5
6 import re
7
9 '''
10 Allows easy parsing of a csv file. This function
11 convert an iterator on line over a csv text file
12 in an iterator on data list. Each list corresponds
13 to all values present n one line.
14
15 @param lineIterator: iterator on text lines
16 @type lineIterator: iterator
17 @param sep: string of one letter used as separator
18 blank charactere or " is not allowed as
19 separator
20 @type sep: string
21 @return: an iterator on data list
22 @rtype: iterator
23 '''
24 assert len(sep)==1 and not sep.isspace() and sep!='"'
25 valueMatcher=re.compile('\s*((")(([^"]|"")*)"|([^%s]*?))\s*(%s|$)' % (sep,sep))
26 def iterator():
27 for l in lineIterator:
28 yield _csvParse(l,valueMatcher)
29 return iterator()
30
31
33 data=[]
34 i = iter(valueMatcher.findall(line))
35 m = i.next()
36 if m[0]:
37 while m[-1]!='':
38 if m[1]=='"':
39 data.append(m[2].replace('""','"'))
40 else:
41 data.append(m[0])
42 m=i.next()
43 if m[1]=='"':
44 data.append(m[2].replace('""','"'))
45 else:
46 data.append(m[0])
47 return data
48