An error occurred while loading the file. Please try again.
-
jezozwierzak authored493c914d
CSVWriter.py 8.11 KiB
#!/usr/bin/python
#-*- coding: utf-8 -*-
'''
Created on 03-08-2012
@author: jezozwierzak
'''
class CSVWriter:
def __init__(self, separator = ';'):
self.widths = []
self.list = []
self.rows = 0
self.columns = 0
self.separator = separator
def addSubColumn(self, parentIndex, name):
parentColumn = self.list[parentIndex];
parentColumn.append([name])
subColsStr = ''
for i in range(1,len(parentColumn)):
subColsStr += parentColumn[i][0] + self.separator
if len(subColsStr) > self.widths[parentIndex]:
self.widths[parentIndex] = len(subColsStr) - 1
if len(parentColumn[1:]) > 1:
self.columns+=1
def addSubColumnByName(self, parentName, name):
assert self.rows == 0, 'You have to add all Column names before adding rows'
parentIndex = self.columnIndex(parentName)
self.addSubColumn(parentIndex, name)
def addSubColumnsByName(self, parentName, names=[]):
for name in names:
self.addSubColumnByName(parentName, name)
def addSubColumns(self, parentIndex, names=[]):
for name in names:
self.addSubColumn(parentIndex, name)
def addColumn(self, name):
assert self.rows == 0, 'You have to add all Column names before adding rows'
self.list.append([name])
self.widths.append(len(name))
self.columns+=1
def addColumns(self, names=[]):
for name in names:
self.addColumn(name)
def addRow(self, row=[]):
assert len(row) == len(self.list), 'Wrong number of columns in row'
for i in range(0,len(self.list)):
column = self.list[i]
if len(column) > 1 and type(column[1]).__name__ == 'list':
#Adding data to subcolumns
assert len(row[i]) == len(column) - 1, 'Wrong number of subColumns in column ' + column[0]
for j in range(0,len(row[i])):
column[j+1].append(row[i][j])
subColsStr = ''
for j in range(0,len(row[i])):
subColsStr += '{0:{base}}'.format(row[i][j], base='.4f') + self.separator + ' '
if len(subColsStr) > self.widths[i]:
self.widths[i] = len(subColsStr) - 1
else:
#Adding data to column
column.append(row[i])
if len(str(row[i])) > self.widths[i]:
self.widths[i] = len(str(row[i]))
self.rows+=1
def allWidth(self):
sum = 0
for width in self.widths:
sum += width
return width
def columnIndex(self, name):
for column in self.list:
if column[0] == name:
return self.list.index(column)
def hasSubColumns(self):
for column in self.list:
if len(column) > 1 and type(column[1]).__name__ == 'list':
return True
return False
def hasColumnSubColumns(self, index):
column = self.list[index]
return len(column) > 1 and type(column[1]).__name__ == 'list'
def repeat_to_length(self, string_to_expand, length):
return (string_to_expand * ((length/len(string_to_expand))+1))[:length]
def count_avg(self, ):
results = []
if not self.hasSubColumns():
for i in range(0,len(self.list)): #Iterowanie po kolumnach
results.append(0)
for j in range(1,1+self.rows): # Iterowanie po wierszach
results[i]+= self.list[i][j]
results[i]/=self.rows
else:
for i in range(0,len(self.list)): #Iterowanie po kolumnach
if self.hasColumnSubColumns(i):
subResults = []
for k in range(0,len(self.list[i][1:])):
subColumn = self.list[i][1:][k]
subResults.append(0)
for j in range(1,1+self.rows): # Iterowanie po wierszach
subResults[k]+= subColumn[j]
subResults[k]/=self.rows
results.append(subResults)
else:
results.append(0)
for j in range(1,1+self.rows): # Iterowanie po wierszach
results[i]+= self.list[i][j]
results[i]/=self.rows
results = results[1:]
results[:0] = ['AVG']
self.addRow(results)
def __str__(self):
result = ''
if not self.hasSubColumns():
for j in range(0,1+self.rows): # Iterowanie po wierszach
for i in range(0, len(self.list)): #Iterowanie po kolumnach
if type(self.list[i][j]).__name__=='int':
result += '{0:{width}{base}}'.format(self.list[i][j], base='d', width=self.widths[i]) + self.separator
elif type(self.list[i][j]).__name__=='float':
result += '{0:{width}{base}}'.format(self.list[i][j], base='.4f', width=self.widths[i]) + self.separator
else:
result += '{0:{width}{base}}'.format(self.list[i][j], base='s', width=self.widths[i]) + self.separator
result += '\n'
else:
#Printing Thead
thead = zip(*self.list)[0]
for i in range(0,len(thead)):
if self.hasColumnSubColumns(i):
numberOfColumns = len(self.list[i][1:])
result += '{0:{width}{base}}'.format(thead[i], base='s', width=self.widths[i]-numberOfColumns+1) + self.separator
for j in range(1,numberOfColumns):
result += self.separator
else:
result += '{0:{width}{base}}'.format(thead[i], base='s', width=self.widths[i]) + self.separator
result += '\n'
#Printing subTheads:
for i in range(0,len(self.list)):
if self.hasColumnSubColumns(i):
numberOfColumns = len(self.list[i][1:])
for subColumn in self.list[i][1:]:
result += '{0:{width}{base}}'.format(subColumn[0], base='s', width=(self.widths[i]/numberOfColumns)) + self.separator
else:
result += '{0:{width}{base}}'.format('', base='s', width=self.widths[i]) + self.separator
result += '\n'
#Printing Data
for j in range(1,1+self.rows): # Iterowanie po wierszach
for i in range(0, len(self.list)): #Iterowanie po kolumnach
if self.hasColumnSubColumns(i):
for subcolumns in self.list[i][1:]:
if type(subcolumns[j]).__name__=='int':
result += '{0:{width}{base}}'.format(subcolumns[j], base='d', width=(self.widths[i]/numberOfColumns)) + self.separator
elif type(subcolumns[j]).__name__=='float':
result += '{0:{width}{base}}'.format(subcolumns[j], base='.4f', width=(self.widths[i]/numberOfColumns)) + self.separator
else:
result += '{0:{width}{base}}'.format(subcolumns[j], base='s', width=(self.widths[i]/numberOfColumns)) + self.separator
else:
if type(self.list[i][j]).__name__=='int':
result += '{0:{width}{base}}'.format(self.list[i][j], base='d', width=self.widths[i]) + self.separator
elif type(self.list[i][j]).__name__=='float':
result += '{0:{width}{base}}'.format(self.list[i][j], base='.4f', width=self.widths[i]) + self.separator
else:
result += '{0:{width}{base}}'.format(self.list[i][j], base='s', width=self.widths[i]) + self.separator
result += '\n'
return result