Skip to content

Instantly share code, notes, and snippets.

@chrisleavoy
Created January 13, 2017 19:45
Show Gist options
  • Save chrisleavoy/d0a0039bb31c3a333c48fe932dc9f48b to your computer and use it in GitHub Desktop.
Save chrisleavoy/d0a0039bb31c3a333c48fe932dc9f48b to your computer and use it in GitHub Desktop.
Rate deck compare
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