Reputation: 319
I have CSV file like this:
Datetime, Usage1, Project1
Datetime, Usage2, Project1
Datetime, Usage3, Project2
Datetime, Usage4, Project3
Goal is to summarize Usage per Project and have a report like this:
Project1: Usage1 Usage2
Project2: Usage3
Project3: Usage4
I started with the following Python code, however it is not working properly:
#/usr/bin/python
# obtain all Project values into new list project_tags:
project_tags = []
ifile = open("file.csv","r")
reader = csv.reader(ifile)
headerline = ifile.next()
for row in reader:
project_tags.append(str(row[2]))
ifile.close()
# obtain sorted and unique list and put it into a new list project_tags2
project_tags2 = []
for p in list(set(project_tags)):
project_tags2.append(p)
# open CSV file again and compare it with new unique list
ifile2 = open("file.csv","r")
reader2 = csv.reader(ifile2)
headerline = ifile2.next()
# Loop through both new list and a CSV file, and if they matches sum it:
sum_per_project = sum_per_project + int(row[29])
for project in project_tags2:
for row in reader2:
if row[2] == project:
sum_per_project = sum_per_project + int(row[1])
Any input is appreciated!
Thanks in advance.
Upvotes: 2
Views: 206
Reputation: 4862
Here's an approach with a defaultdict
.
Edit:
Thanks to @Saleem's for reminding me of with
clause, and that we just need to output the contents
from collections import defaultdict
import csv
summary = defaultdict(list)
with open(path, "r") as f:
rows = csv.reader(f)
header = rows.next()
for (dte, usage, proj) in rows:
summary[proj.strip()]+=[usage.strip()]
# I just realized that all you needed to do was output them:
for proj, usages in sorted(summary.iteritems()):
print(
"%s: %s" % (proj, ' '.join(sorted(usages)))
)
Will print
Project1: Usage1 Usage2
Project2: Usage3
Project3: Usage4
Upvotes: 0
Reputation: 8978
Try following snippet:
summary = {}
with open("file.csv", "r") as fp:
for line in fp:
row = line.rstrip().split(',')
key = row[2]
if key in summary:
summary[key] += (row[1].strip(),)
else:
summary[key] = (row[1].strip(),)
for k in summary:
print('{0}: {1}'.format(k, ' '.join(summary[k])))
Based on your sample data in csv file, it will print:
Project1: Usage1 Usage2
Project2: Usage3
Project3: Usage4
Upvotes: 1