65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
|
|
class RowReader(dict):
|
|
header = []
|
|
skipheader = False
|
|
def __init__(self,skipheader=False,newline="\n",*arg,**kw):
|
|
super(RowReader, self).__init__(*arg, **kw)
|
|
|
|
def __rrshift__(self, stream):
|
|
strbuffer = ""
|
|
buffer2 = ""
|
|
currentheader = 0
|
|
strbuffer = stream
|
|
strbuffer = strbuffer.strip()
|
|
c = ''
|
|
startquote = False
|
|
if (len(self.header) == 0 and not self.skipheader):
|
|
self.header = strbuffer.split(",")
|
|
else:
|
|
for i in range(0, len(strbuffer)):
|
|
c = strbuffer[i]
|
|
if c == ",":
|
|
if startquote:
|
|
buffer2 += c
|
|
continue
|
|
if not self.skipheader:
|
|
self[self.header[currentheader]] = buffer2
|
|
else:
|
|
self[str(currentheader)] = buffer2
|
|
buffer2 = ""
|
|
currentheader += 1
|
|
continue
|
|
|
|
if c == "\"":
|
|
if startquote:
|
|
buffer2 += "\""
|
|
buffer2 = buffer2.ltrim()
|
|
if (i-1) >= 0 and buffer[i-1] == "\\":
|
|
buffer2.write(c)
|
|
continue
|
|
startquote = not startquote
|
|
if not startquote:
|
|
for x in range(i, len(strbuffer)):
|
|
if strbuffer[x] == ',' or x == len(strbuffer):
|
|
i = x - 1
|
|
break
|
|
|
|
buffer2 += c
|
|
if not self.skipheader:
|
|
self[self.header[currentheader]] = buffer2
|
|
else:
|
|
self[str(currentheader)] = buffer2
|
|
return stream
|
|
|
|
class RowWriter(list):
|
|
def __init__(self,*arg,**kw):
|
|
super(RowWriter, self).__init__(*arg, **kw)
|
|
pass
|
|
|
|
f = open("sampledata.csv")
|
|
r = RowReader()
|
|
for l in f:
|
|
l >> r
|
|
if r != {}:
|
|
print str(r)
|