Created
January 13, 2017 19:45
-
-
Save chrisleavoy/d0a0039bb31c3a333c48fe932dc9f48b to your computer and use it in GitHub Desktop.
Rate deck compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"encoding/csv" | |
"fmt" | |
"log" | |
"os" | |
"strconv" | |
"io" | |
"math" | |
) | |
func logFatalErr(err error) { | |
if err != nil { | |
fmt.Printf("Fatal Error: %v\n", err) | |
log.Fatal(err) | |
} | |
} | |
func readRateDeck(csvFileName string) (rateDeck map[string]float64) { | |
csvIn, err := os.Open(csvFileName) | |
logFatalErr(err) | |
fmt.Println("open") | |
rateDeck = make(map[string]float64) | |
csvReader := csv.NewReader(csvIn) | |
fmt.Println("reader") | |
// squash first line: | |
csvReader.Read() | |
for { | |
var rec, err = csvReader.Read() | |
if err == io.EOF { | |
break | |
} | |
var npa_nxx = rec[0] | |
if string(npa_nxx[0]) != "1" { | |
npa_nxx = "1" + npa_nxx | |
} | |
var rate1, _ = strconv.ParseFloat(rec[1], 64) | |
var rate2, _ = strconv.ParseFloat(rec[2], 64) | |
// take max of inter vs intra rates | |
rateDeck[npa_nxx] = math.Max(rate1, rate2) | |
//logFatalErr(err) | |
} | |
err = csvIn.Close() | |
fmt.Println("close") | |
return rateDeck | |
} | |
func parseCDR(csv []string) (to, from, start, end string, duration int64, source, destination string){ | |
durationInt, err := strconv.ParseInt(csv[4], 10, 64) | |
logFatalErr(err) | |
return csv[0], csv[1], csv[2], csv[3], durationInt, csv[5], csv[6] | |
} | |
func processCDRandCompareRateDecks(cdrFile string, deck1, deck2 map[string]float64) { | |
csvIn, err := os.Open(cdrFile) | |
logFatalErr(err) | |
fmt.Println("openCDR") | |
csvReader := csv.NewReader(csvIn) | |
fmt.Println("readCDR") | |
var missingRate = 0 | |
var missingRate1 = 0 | |
var missingRate2 = 0 | |
var missingMinutes = 0.0 | |
var rate1Total = 0.0 | |
var rate2Total = 0.0 | |
var deck1Minutes = 0.0 | |
var deck2Minutes = 0.0 | |
var totalCalls = 0 | |
var totalMinutes = 0.0 | |
var inNetworkCalls = 0 | |
var inNetworkMinutes = 0.0 | |
var ildCalls = 0 | |
var ildMinutes = 0.0 | |
var tollFreeCalls = 0 | |
var tollFreeMinutes = 0.0 | |
var domesticCalls = 0 | |
var domesticMinutes = 0.0 | |
tollFreeNpas := map[string]float64 { | |
"1800": 0.0, | |
"1888": 0.0, | |
"1877": 0.0, | |
"1866": 0.0, | |
"1855": 0.0, | |
"1844": 0.0, | |
} | |
for { | |
var rec, err = csvReader.Read() | |
totalCalls++ | |
// fmt.Printf("%#v\n", rec) | |
if totalCalls == 1 { | |
continue | |
} | |
if err == io.EOF { | |
break | |
} | |
logFatalErr(err) | |
var to, _, _, _, duration, _, destination = parseCDR(rec) | |
var durationMinutes = float64(duration) / 60 | |
totalMinutes += durationMinutes | |
if destination != "pstn" { | |
inNetworkCalls++ | |
inNetworkMinutes += durationMinutes | |
continue | |
} | |
if string(to[0]) != "1" { | |
ildCalls++ | |
ildMinutes += durationMinutes | |
continue | |
} | |
var npa = to[0:4] | |
_, tollFree := tollFreeNpas[npa] | |
if tollFree { | |
tollFreeCalls++ | |
tollFreeMinutes += durationMinutes | |
continue | |
} | |
domesticCalls++ | |
domesticMinutes += durationMinutes | |
var npa_nxx = to[0:7] | |
rate1, rate1Exists := deck1[npa_nxx] | |
rate2, rate2Exists := deck2[npa_nxx] | |
if !rate1Exists { | |
missingRate1++ | |
} | |
if !rate2Exists { | |
missingRate2++ | |
} | |
if rate1Exists && rate2Exists { | |
rate1Total += rate1 * float64(duration) / 60 | |
rate2Total += rate2 * float64(duration) / 60 | |
deck1Minutes += durationMinutes | |
deck2Minutes += durationMinutes | |
} else { | |
missingRate++ | |
missingMinutes += durationMinutes | |
if totalCalls < 500 { | |
fmt.Printf("%#v\n", rec) | |
} | |
} | |
} | |
fmt.Println("Calls:") | |
fmt.Printf("%20s: %d\n", "ILD", ildCalls) | |
fmt.Printf("%20s: %d\n", "Domestic", domesticCalls) | |
fmt.Printf("%20s: %d\n", "TollFree", tollFreeCalls) | |
fmt.Printf("%20s: %d\n", "Total", totalCalls) | |
fmt.Printf("%20s: %d\n", "Either rate missing", missingRate) | |
fmt.Printf("%20s: %.0f\n", "Missing Minutes", missingMinutes) | |
fmt.Println() | |
fmt.Println("Minutes:") | |
fmt.Printf("%20s: %.0f\n", "ILD", ildMinutes) | |
fmt.Printf("%20s: %.0f\n", "Domestic", domesticMinutes) | |
fmt.Printf("%20s: %.0f\n", "TollFree", tollFreeMinutes) | |
fmt.Printf("%20s: %.0f\n", "Total", totalMinutes) | |
fmt.Println() | |
fmt.Println("Deck1:") | |
fmt.Printf("%20s: %d\n", "Missing Rate", missingRate1) | |
fmt.Printf("%20s: %.0f\n", "Minutes", deck1Minutes) | |
fmt.Printf("%20s: $%.2f\n", "Term Cost", rate1Total) | |
fmt.Println() | |
fmt.Println("Deck2:") | |
fmt.Printf("%20s: %d\n", "Missing Rate", missingRate2) | |
fmt.Printf("%20s: %.0f\n", "Minutes", deck2Minutes) | |
fmt.Printf("%20s: $%.2f\n", "Term Cost", rate2Total) | |
fmt.Println() | |
// err = csvIn.Close() | |
fmt.Println("closeCDR") | |
} | |
func main() { | |
fmt.Println("hello") | |
var rates1 = readRateDeck("/Users/chris.leavoy/Documents/Onvoy Rate Decks/DOM-EUTERM-11142016.csv") | |
//var rates2 = readRateDeck("/Users/chris.leavoy/Documents/LayeredCallLogs/bandwidth_term_deck_2017010401.csv") | |
// var rates2 = readRateDeck("/Users/chris.leavoy/Documents/Onvoy Rate Decks/Prime_12_29_2016.csv") | |
// var rates2 = readRateDeck("/Users/chris.leavoy/Documents/Onvoy Rate Decks/Onvoy_TextNow_RatePlan2_08052016.csv") | |
var rates2 = readRateDeck("/Users/chris.leavoy/Documents/Onvoy Rate Decks/Iristel_Coverage_Onnet_2016-11-21 14_06_04_1479737164.csv") | |
var cdrFile = "/Users/chris.leavoy/Documents/LayeredCallLogs/cdr/2016-10-25.csv" | |
processCDRandCompareRateDecks(cdrFile, rates1, rates2) | |
//fmt.Println(len(rates1)) | |
//fmt.Println(len(rates2)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment