CIS 111 Control break report I

Objectives

  • Read data from a sequential access text file
  • Convert a line of data into its constituent fields
  • Correctly end a file input loop when end of file is reached
  • Process control breaks correctly
  • Calculate sums for groupings of input data
  • Implement an algorithm
  • Properly format output data on a report

Program requirements

This assignment involves the creation of a level break report by correctly implementing the supplied algorithm in Python. The data must be in correct sorted order for this algorithm to work. The supplied data file has already been put into the proper sorted order. Your program must read each of the records from the data file, parse the record into fields, and produce a control break report to a disk file named cb1rpt.txt. Your report should match the sample report exactly, including ALL formatting and spacing. Please note that since you are sending it to a disk file, you will not see the report on the screen when you run the program. You can view it later by opening it up in a text editor.

The fields for each record are comma separated. The string fields have quote marks surrounding them. Look at the data file to see a detailed view. The format of each record is as follows:

  • department: string
  • employee id: string
  • month: integer
  • day: integer
  • year: integer
  • hours: floating point number

The data file needed for this assignment is located at: cb1data.txt.

Sample Output

Daily hours worked by Department by Employee Dept EmpID Date Hours IT D4772 1/02/2011 8.25 IT D4772 1/03/2011 7.00 IT D4772 1/05/2011 9.25 IT D4772 1/06/2011 9.00 IT D4772 1/08/2011 7.25 Employee total 40.75 IT F9642 1/04/2011 8.25 IT F9642 1/06/2011 7.25 IT F9642 1/07/2011 5.25 IT F9642 1/08/2011 8.00 Employee total 28.75 IT V1001 1/03/2011 5.25 IT V1001 1/04/2011 8.50 IT V1001 1/05/2011 6.75 IT V1001 1/06/2011 6.75 IT V1001 1/07/2011 8.00 IT V1001 1/08/2011 6.00 Employee total 41.25 Department total 110.75 MGT A0010 1/02/2011 6.50 MGT A0010 1/03/2011 8.25 MGT A0010 1/04/2011 9.25 MGT A0010 1/05/2011 9.75 MGT A0010 1/06/2011 5.50 MGT A0010 1/07/2011 8.75 MGT A0010 1/08/2011 8.75 Employee total 56.75 MGT S0812 1/04/2011 5.25 MGT S0812 1/05/2011 7.75 MGT S0812 1/06/2011 7.25 MGT S0812 1/07/2011 6.00 MGT S0812 1/08/2011 9.50 Employee total 35.75 Department total 92.50 MKT H6554 1/02/2011 9.25 MKT H6554 1/03/2011 8.00 MKT H6554 1/04/2011 5.75 MKT H6554 1/05/2011 8.75 MKT H6554 1/06/2011 8.50 MKT H6554 1/08/2011 6.00 Employee total 46.25 Department total 46.25 MNT E5109 1/02/2011 8.75 MNT E5109 1/03/2011 5.50 MNT E5109 1/04/2011 6.00 MNT E5109 1/06/2011 5.00 MNT E5109 1/08/2011 6.50 Employee total 31.75 Department total 31.75 MSC E4100 1/03/2011 5.75 MSC E4100 1/04/2011 8.75 MSC E4100 1/05/2011 7.25 MSC E4100 1/07/2011 6.50 MSC E4100 1/08/2011 8.75 Employee total 37.00 Department total 37.00 PRD A0132 1/04/2011 9.00 PRD A0132 1/05/2011 8.00 PRD A0132 1/06/2011 8.75 PRD A0132 1/07/2011 9.00 PRD A0132 1/08/2011 5.00 Employee total 39.75 PRD E1231 1/02/2011 6.75 PRD E1231 1/03/2011 8.25 PRD E1231 1/04/2011 6.75 PRD E1231 1/06/2011 8.00 PRD E1231 1/07/2011 5.50 PRD E1231 1/08/2011 7.25 Employee total 42.50 PRD E1250 1/02/2011 9.75 PRD E1250 1/03/2011 7.75 PRD E1250 1/04/2011 7.75 PRD E1250 1/05/2011 7.50 Employee total 32.75 Department total 115.00 SLS L1776 1/02/2011 9.00 SLS L1776 1/03/2011 7.75 SLS L1776 1/04/2011 6.75 SLS L1776 1/06/2011 5.50 SLS L1776 1/08/2011 8.75 Employee total 37.75 SLS M5205 1/02/2011 7.00 SLS M5205 1/03/2011 5.00 SLS M5205 1/04/2011 7.75 SLS M5205 1/05/2011 6.00 SLS M5205 1/06/2011 7.75 SLS M5205 1/07/2011 5.25 SLS M5205 1/08/2011 8.25 Employee total 47.00 Department total 84.75 Total hours worked 518.00 70 records processed

Pseudocode

To make life even easier for you, here's the pseudocode for the program:

open input file for text access open output (report) file print headings to report file totHours = empHours = deptHours = 0 prevID = prevDept = "$$$" recno = 0 while there are still more records in the input file read the next record from the input file as a line parse the record just read into its constituent fields recno = recno + 1 if record's dept is different than prevDept and recno > 1 // employee level break print employee's total hours to output file add empHours to deptHours empHours = 0 // department level break print department's total hours to output file add deptHours to totHours deptHours = 0 otherwise if record's employee id is different than prevID and recno > 1 // employee level break print employee's total hours to output file add empHours to deptHours empHours = 0 print formatted record detail to output file add record's hours to empHours prevID = record's employee id prevDept = record's department close input file // employee level break print employee's total hours to output file add empHours to deptHours empHours = 0 // department level break print department's total hours to output file add deptHours to totHours deptHours = 0 print grand totals to output file print footers to output file close output file end

Notes

  • A string can be broken into a list of tokens based on a delimiter using the .split(delimiter) function
  • Example for string using a comma for a field delimiter: list = str.split(",")
  • A string can have leading and trailing characters stripped using the .strip(character) function
  • Example for stripping quotes from a string: str = str.strip('"')

Rubric

  • 2 points for comments at the start with program name, student name, assignment, date, course, program description
  • 2 points for correctly following coding conventions (indentation, naming rules, NO tabs, etc.)
  • 2 points for having the four report heading lines (two are blank lines) as shown on the sample and making sure the headings line up with the data in neat columns
  • 1 point for displaying the number of records processed line at the end of the report
  • 2 points for correctly using the input (data) file
  • 2 points for correctly using the output (report) file
  • 5 points for correctly separating the input into its constituent fields
  • 3 points for having the correct employee totals
  • 3 points for having the correct department totals
  • 1 point for having the correct grand total
  • 8 points for correctly handling employee and department level breaks
  • 3 points for matching the sample output format for record detail lines
  • 2 points for matching the sample output format for employee total lines
  • 2 points for matching the sample output format for department total lines
  • 2 points for matching the sample output format for the total hours line