// Static project main.go
package main
import (
//"bytes"
"flag"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
/*定義cdr話單文件結(jié)構(gòu)體*/
type CdrFile struct {
CdrHead
CdrData
}
/*定義cdr話單文件頭結(jié)構(gòu)體*/
type CdrHead struct {
File_length uint /*文件總長(zhǎng)度*/
Header_length uint /*頭長(zhǎng)度*/
High_Release_Identifier string /*High_Release_Identifier*/
High_Version_Identifier string /*High_Version_Identifier*/
Low_Release_Identifier string /*Low_Release_Identifier*/
Low_Version_Identifier string /*Low_Version_Identifier*/
File_opening_timestamp uint /*文件打開(kāi)時(shí)間戳*/
Timestamp_when_last_CDR_was_appended_to_file uint /*最后一個(gè)cdr添加到文件的時(shí)間戳*/
Number_of_CDRs_in_file uint /*cdr個(gè)數(shù)*/
File_sequence_number uint /*文件序列號(hào)*/
File_Closure_Trigger_Reason uint /*文件關(guān)閉的原因*/
IP_Address_of_Node_that_generated_file []byte /*生成話單的節(jié)點(diǎn)地址*/
Lost_CDR_indicator uint /*丟失話單指示*/
Length_of_CDR_routeing_filter uint /*cdr路由過(guò)濾的長(zhǎng)度*/
}
/*定義話單文件話單部分結(jié)構(gòu)體*/
type CdrData struct {
System_type uint /*業(yè)務(wù)類型*/
Record_type uint /*記錄類型*/
Source_addr []string /*數(shù)據(jù)源*/
Sequence uint /*序列號(hào)*/
File_name string /*原始話單文件名*/
CauseForRecClosing uint /*話單關(guān)閉原因*/
Create_date []string /*話單生成時(shí)間*/
Imsi_number string /*用戶imsi*/
Start_datetime []string /*用戶上線時(shí)間*/
End_datetime []string /*用戶下線時(shí)間*/
Duaration uint /*時(shí)長(zhǎng)*/
Data_up uint /*上行流量*/
Data_down uint /*下行流量*/
Cell_id string /*小區(qū)id*/
Local_up uint /*本地上行流量*/
Local_down uint /*本地下行流量*/
}
/*定義cdr流量統(tǒng)計(jì)信息結(jié)構(gòu)體*/
type CdrStatic struct {
//Imsi_number string /*用戶imsi*/
//Cell_id string /*小區(qū)id*/
Duaration uint /*時(shí)長(zhǎng)*/
Data_up uint /*上行流量*/
Data_down uint /*下行流量*/
Local_up uint /*本地上行流量*/
Local_down uint /*本地下行流量*/
}
/*16進(jìn)制轉(zhuǎn)換成10進(jìn)制*/
func computer(b []byte, n int) uint {
tmp := uint(0)
nn := uint(8 * (n - 1))
for i := 0; i < n; i++ {
tmp += uint(b[i]) << nn
nn = nn - 8
}
return tmp
}
/*計(jì)算話單offset*/
func offset_cdr(f *os.File, cdrindex int) int {
if cdrindex == 0 {
return 50
} else {
cdroffset := offset_cdr(f, cdrindex-1)
f.Seek(int64(cdroffset), 0)
buffer := make([]byte, 2)
f.Read(buffer)
cdrlen := int(buffer[0]*16+buffer[1]*1) + 4
return cdrlen + cdroffset
}
}
/*話單文件頭解析*/
func (cdrhead *CdrHead) Parse(f *os.File) CdrHead {
/*文件讀取位置歸零*/
f.Seek(0, 0)
/*計(jì)算文件總長(zhǎng)度*/
buffer := make([]byte, 4)
f.Read(buffer)
cdrhead.File_length = computer(buffer, 4)
//fmt.Println(cdrhead.File_length)
/*計(jì)算文件頭長(zhǎng)度*/
f.Seek(0, os.SEEK_CUR)
f.Read(buffer)
cdrhead.Header_length = computer(buffer, 4)
//fmt.Println(cdrhead.Header_length)
if cdrhead.Header_length != 50 {
fmt.Println()
fmt.Println("不能解析此文件,請(qǐng)確認(rèn)是否為話單文件格式!")
fmt.Println()
os.Exit(0)
}
/*計(jì)算High Release Identifier + High Version Identifier*/
f.Seek(0, os.SEEK_CUR)
buffer = make([]byte, 1)
f.Read(buffer)
cdrhead.High_Release_Identifier = string(strconv.FormatInt(int64(buffer[0]), 16)[0])
cdrhead.High_Version_Identifier = string(strconv.FormatInt(int64(buffer[0]), 16)[1])
/*計(jì)算Low Release Identifier + Low Version Identifier*/
f.Seek(0, os.SEEK_CUR)
f.Read(buffer)
cdrhead.Low_Release_Identifier = string(strconv.FormatInt(int64(buffer[0]), 16)[0])
cdrhead.Low_Version_Identifier = string(strconv.FormatInt(int64(buffer[0]), 16)[1])
/*計(jì)算File opening timestamp*/
f.Seek(0, os.SEEK_CUR)
buffer = make([]byte, 4)
f.Read(buffer)
cdrhead.File_opening_timestamp = computer(buffer, 4)
/*計(jì)算Timestamp when last CDR was appended to file*/
f.Seek(0, os.SEEK_CUR)
f.Read(buffer)
cdrhead.Timestamp_when_last_CDR_was_appended_to_file = computer(buffer, 4)
/*計(jì)算Number of CDRs in file*/
f.Seek(0, os.SEEK_CUR)
f.Read(buffer)
cdrhead.Number_of_CDRs_in_file = computer(buffer, 4)
/*計(jì)算File sequence number*/
f.Seek(0, os.SEEK_CUR)
f.Read(buffer)
cdrhead.File_sequence_number = computer(buffer, 4)
/*計(jì)算File Closure Trigger Reason*/
f.Seek(0, os.SEEK_CUR)
buffer = make([]byte, 1)
f.Read(buffer)
cdrhead.File_Closure_Trigger_Reason = computer(buffer, 1)
/*計(jì)算IP Address of Node that generated file*/
f.Seek(0, os.SEEK_CUR)
buffer = make([]byte, 20)
f.Read(buffer)
cdrhead.IP_Address_of_Node_that_generated_file = buffer
/*計(jì)算Lost CDR indicator*/
f.Seek(0, os.SEEK_CUR)
buffer = make([]byte, 1)
f.Read(buffer)
cdrhead.Lost_CDR_indicator = computer(buffer, 1)
/*計(jì)算Length of CDR routeing filter*/
f.Seek(0, os.SEEK_CUR)
buffer = make([]byte, 2)
f.Read(buffer)
cdrhead.Length_of_CDR_routeing_filter = computer(buffer, 1)
return *cdrhead
}
/*話單文件頭打印*/
func (cdrhead CdrHead) Printf() {
}
/*話單文件話單數(shù)據(jù)解析*/
func (cdrdata *CdrData) Parse(f *os.File, cdrindex int) CdrData {
/*文件讀取位置歸零*/
f.Seek(0, 0)
offset := offset_cdr(f, cdrindex)
f.Seek(int64(offset), 0)
buffer := make([]byte, 2)
f.Read(buffer)
cdrdatalen := buffer[0]*16 + buffer[1]*1
tlvlen := cdrdatalen
offset = offset + 4
f.Seek(int64(offset), 0)
/*循環(huán)讀取cdr*/
for tlvlen > 0 {
buffer = make([]byte, 1)
f.Read(buffer)
t := buffer[0]
offset = offset + 1
f.Seek(int64(offset), 0)
buffer = make([]byte, 1)
f.Read(buffer)
l := buffer[0]
offset = offset + 1
f.Seek(int64(offset), 0)
switch strconv.FormatInt(int64(t), 16) {
/*業(yè)務(wù)類型*/
case "f9":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.System_type = computer(buffer, int(l))
/*記錄類型*/
case "80":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Record_type = computer(buffer, int(l))
/*數(shù)據(jù)源*/
case "a4":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
buffer = buffer[2:]
_buffer := make([]string, int(l)-2)
for i, v := range buffer {
//_buffer[i] = strconv.FormatInt(int64(v), 16)
_buffer[len(buffer)-i-1] = strconv.FormatInt(int64(v), 10)
}
cdrdata.Source_addr = _buffer
/*序列號(hào)*/
case "91":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Sequence = computer(buffer, int(l))
/*原始話單文件名*/
case "90":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.File_name = string(buffer)
/*話單關(guān)閉的原因*/
case "8f":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.CauseForRecClosing = computer(buffer, int(l))
/*話單生成時(shí)間*/
case "8d":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l)-3)
f.Read(buffer)
_buffer := make([]string, int(l)-3)
for i, v := range buffer {
_buffer[i] = strconv.FormatInt(int64(v), 16)
}
cdrdata.Create_date = _buffer
/*IMSI*/
case "83":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
/*
for i, v := range buffer {
_buffer[i] = strconv.FormatInt(int64(v), 16)
imsi_i := strings.Split(_buffer[i], "")[1]
buf.WriteString(imsi_i)
}
*/
cdrdata.Imsi_number = string(buffer)
/*開(kāi)始時(shí)間*/
case "a6":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l)-3)
f.Read(buffer)
_buffer := make([]string, int(l)-3)
for i, v := range buffer {
_buffer[i] = strconv.FormatInt(int64(v), 16)
}
cdrdata.Start_datetime = _buffer
/*結(jié)束時(shí)間*/
case "a7":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l)-3)
f.Read(buffer)
_buffer := make([]string, int(l)-3)
for i, v := range buffer {
_buffer[i] = strconv.FormatInt(int64(v), 16)
}
cdrdata.End_datetime = _buffer
/*時(shí)長(zhǎng)*/
case "8e":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Duaration = computer(buffer, int(l))
/*上行流量*/
case "8c":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Data_up = computer(buffer, int(l))
/*下行流量*/
case "82":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Data_down = computer(buffer, int(l))
/*小區(qū)id*/
case "a0":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Cell_id = string(buffer)
/*本地上行流量*/
case "be":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Local_up = computer(buffer, int(l))
/*本地下行流量*/
case "bf":
f.Seek(int64(offset), 0)
buffer = make([]byte, int(l))
f.Read(buffer)
cdrdata.Local_down = computer(buffer, int(l))
}
tlvlen = tlvlen - l - 2
offset = offset + int(l)
f.Seek(int64(offset), 0)
}
return *cdrdata
}
/*話單文件話單數(shù)據(jù)打印*/
func (cdrdata CdrData) Printf() {
fmt.Println(strings.Repeat("*", 100))
if cdrdata.System_type == 3 {
fmt.Printf("%-50s%+v\n", "system_type:", "寬帶業(yè)務(wù)")
} else {
fmt.Printf("%-50s%+v\n", "system_type:", "未知業(yè)務(wù)")
}
if cdrdata.Record_type == 85 {
fmt.Printf("%-50s%+v\n", "record_type:", "PGW上報(bào)")
} else {
fmt.Printf("%-50s%+v\n", "record_type:", "未知上報(bào)")
}
fmt.Printf("%-50s%+v\n", "source_addr:", strings.Join(cdrdata.Source_addr, "."))
fmt.Printf("%-50s%+v\n", "sequence:", cdrdata.Sequence)
fmt.Printf("%-50s%+v\n", "file_name:", cdrdata.File_name)
fmt.Printf("%-50s%+v\n", "causeForRecClosing:", cdrdata.CauseForRecClosing)
fmt.Printf("%-50s%+v年%+v月%+v日%+v時(shí)%+v分%+v秒\n", "create_date:",
cdrdata.Create_date[0], cdrdata.Create_date[1], cdrdata.Create_date[2],
cdrdata.Create_date[3], cdrdata.Create_date[4], cdrdata.Create_date[5])
fmt.Printf("%-50s%+v\n", "imsi_number:", cdrdata.Imsi_number)
fmt.Printf("%-50s%+v\n", "cell_id:", cdrdata.Cell_id)
fmt.Printf("%-50s%+v年%+v月%+v日%+v時(shí)%+v分%+v秒\n", "start_datetime:",
cdrdata.Start_datetime[0], cdrdata.Start_datetime[1], cdrdata.Start_datetime[2],
cdrdata.Start_datetime[3], cdrdata.Start_datetime[4], cdrdata.Start_datetime[5])
fmt.Printf("%-50s%+v年%+v月%+v日%+v時(shí)%+v分%+v秒\n", "end_datetime:",
cdrdata.End_datetime[0], cdrdata.End_datetime[1], cdrdata.End_datetime[2],
cdrdata.End_datetime[3], cdrdata.End_datetime[4], cdrdata.End_datetime[5])
fmt.Printf("%-50s%+v秒\n", "duaration:", cdrdata.Duaration)
fmt.Printf("%-50s%+v字節(jié)\n", "data_up:", cdrdata.Data_up)
fmt.Printf("%-50s%+v字節(jié)\n", "data_down:", cdrdata.Data_down)
fmt.Printf("%-50s%+v字節(jié)\n", "local_up:", cdrdata.Local_up)
fmt.Printf("%-50s%+v字節(jié)\n", "local_down:", cdrdata.Local_down)
fmt.Println(strings.Repeat("*", 100))
}
/*單個(gè)話單文件全部打印*/
func (cdr CdrFile) printf(s string) {
fold, err := os.Stat(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
} else {
if fold.IsDir() {
fmt.Println()
fmt.Println("請(qǐng)輸入文件名!")
fmt.Println()
os.Exit(0)
}
}
f, err := os.Open(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
defer f.Close()
head := cdr.CdrHead.Parse(f)
num := int(head.Number_of_CDRs_in_file)
cdr.CdrData.Parse(f, 0)
fmt.Println()
fmt.Println("話單名稱:", cdr.File_name)
fmt.Println("話單數(shù)目:", num)
fmt.Println()
fmt.Println("num:", 1)
cdr.CdrData.Printf()
fmt.Println()
for i := 1; i < num; i++ {
fmt.Println("num:", i+1)
cdr.CdrData.Parse(f, i)
cdr.CdrData.Printf()
}
}
/*單個(gè)話單文件按條目打印*/
func (cdr CdrFile) printf_num(s string, n int) {
fold, err := os.Stat(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
} else {
if fold.IsDir() {
fmt.Println()
fmt.Println("請(qǐng)輸入文件名!")
fmt.Println()
os.Exit(0)
}
}
f, err := os.Open(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
defer f.Close()
head := cdr.CdrHead.Parse(f)
num := int(head.Number_of_CDRs_in_file)
if n > -1 && n < num {
cdr.CdrData.Parse(f, n)
fmt.Println()
fmt.Println("話單名稱:", cdr.File_name)
fmt.Println("話單數(shù)目:", num)
fmt.Println()
fmt.Println("num:", n+1)
cdr.CdrData.Printf()
} else if n == -1 {
//fmt.Println("打印完畢")
} else {
//fmt.Println(n)
fmt.Println()
fmt.Println("請(qǐng)輸入正確的話單號(hào)! 1 -", num)
fmt.Println()
}
}
/*多個(gè)話單文件打印*/
func (cdr CdrFile) printf_n(s []string) {
for _, v := range s {
fmt.Println()
fmt.Println("文件名稱:", v)
cdr.printf(v)
}
}
/*話單文件打印*/
func (cdr CdrFile) Printf(pstr string) {
if len(flag.Args()) > 0 {
//fmt.Println(flag.Args()[0])
n, err := strconv.Atoi(flag.Args()[0])
if err != nil {
s := append(flag.Args(), pstr)
cdr.printf_n(s)
//fmt.Println(err)
}
cdr.printf_num(pstr, n-1)
} else {
cdr.printf(pstr)
}
}
/*單個(gè)話單文件按imsi統(tǒng)計(jì)流量*/
func (cdr CdrFile) static_imsi(s string) map[string]CdrStatic {
fold, err := os.Stat(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
} else {
if fold.IsDir() {
fmt.Println()
fmt.Println("請(qǐng)輸入文件名!")
fmt.Println()
os.Exit(0)
}
}
f, err := os.Open(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
defer f.Close()
head := cdr.CdrHead.Parse(f)
num := int(head.Number_of_CDRs_in_file)
static_imsi := make(map[string]CdrStatic)
for i := 0; i < num; i++ {
tmp := cdr.CdrData.Parse(f, i)
t := static_imsi[tmp.Imsi_number]
if _, exist := static_imsi[tmp.Imsi_number]; exist {
t.Duaration += tmp.Duaration
t.Data_up += tmp.Data_up
t.Data_down += tmp.Data_down
t.Local_up += tmp.Local_up
t.Local_down += tmp.Local_down
static_imsi[tmp.Imsi_number] = t
} else {
t.Duaration = tmp.Duaration
t.Data_up = tmp.Data_up
t.Data_down = tmp.Data_down
t.Local_up = tmp.Local_up
t.Local_down = tmp.Local_down
static_imsi[tmp.Imsi_number] = t
}
}
return static_imsi
}
/*單個(gè)話單文件按cell統(tǒng)計(jì)流量*/
func (cdr CdrFile) static_cell(s string) map[string]CdrStatic {
fold, err := os.Stat(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
} else {
if fold.IsDir() {
fmt.Println()
fmt.Println("請(qǐng)輸入文件名!")
fmt.Println()
os.Exit(0)
}
}
f, err := os.Open(s)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
defer f.Close()
head := cdr.CdrHead.Parse(f)
num := int(head.Number_of_CDRs_in_file)
static_cell := make(map[string]CdrStatic)
for i := 0; i < num; i++ {
tmp := cdr.CdrData.Parse(f, i)
t := static_cell[tmp.Cell_id]
if _, exist := static_cell[tmp.Cell_id]; exist {
t.Data_up += tmp.Data_up
t.Data_down += tmp.Data_down
t.Local_up += tmp.Local_up
t.Local_down += tmp.Local_down
static_cell[tmp.Cell_id] = t
} else {
t.Data_up = tmp.Data_up
t.Data_down = tmp.Data_down
t.Local_up = tmp.Local_up
t.Local_down = tmp.Local_down
static_cell[tmp.Cell_id] = t
}
}
return static_cell
}
/*多個(gè)話單文件按imsi統(tǒng)計(jì)流量*/
func (cdr CdrFile) static_n_imsi(s []string) map[string]CdrStatic {
static_n_imsi := cdr.static_imsi(s[0])
tmp := make(map[string]CdrStatic)
for i := 1; i < len(s); i++ {
for k, v := range cdr.static_imsi(s[i]) {
for kb, vb := range static_n_imsi {
if kb == k {
vb.Duaration += v.Duaration
vb.Data_up += v.Data_up
vb.Data_down += v.Data_down
vb.Local_up += v.Local_up
vb.Local_down += v.Local_down
static_n_imsi[kb] = vb
delete(tmp, k)
break
} else {
tmp[k] = v
}
}
}
for k, v := range tmp {
static_n_imsi[k] = v
}
}
return static_n_imsi
}
/*多個(gè)話單文件按cell統(tǒng)計(jì)流量*/
func (cdr CdrFile) static_n_cell(s []string) map[string]CdrStatic {
static_n_cell := cdr.static_cell(s[0])
tmp := make(map[string]CdrStatic)
for i := 1; i < len(s); i++ {
for k, v := range cdr.static_cell(s[i]) {
for kb, vb := range static_n_cell {
if kb == k {
//vb.Duaration += v.Duaration
vb.Data_up += v.Data_up
vb.Data_down += v.Data_down
vb.Local_up += v.Local_up
vb.Local_down += v.Local_down
static_n_cell[kb] = vb
delete(tmp, k)
break
} else {
tmp[k] = v
//fmt.Println(tmp)
}
}
}
for k, v := range tmp {
static_n_cell[k] = v
//fmt.Println(k, v)
}
}
return static_n_cell
}
/*話單文件按imsi統(tǒng)計(jì)流量打印信息*/
func (cdr CdrFile) Static_imsi_Printf(str string) {
len := len(flag.Args())
if len > 0 {
s := append(flag.Args(), str)
fmt.Println(strings.Repeat("*", 150))
fmt.Printf("%-10s%-20s%-15s%-30s%-30s%-30s%-30s\n", "sn", "imsi", "Duaration", "Data_up", "Data_down", "Local_up", "Local_down")
fmt.Println()
/*sort排序打印*/
var keys []string
m := cdr.static_n_imsi(s)
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
var i int = 1
for _, k := range keys {
fmt.Printf("%-10d%-20s%-15v%-30v%-30v%-30v%-30v\n", i, k, m[k].Duaration, m[k].Data_up, m[k].Data_down, m[k].Local_up, m[k].Local_down)
i++
}
fmt.Println(strings.Repeat("*", 150))
} else {
static_imsi := cdr.static_imsi(str)
fmt.Println(strings.Repeat("*", 150))
fmt.Printf("%-10s%-20s%-15s%-30s%-30s%-30s%-30s\n", "sn", "imsi", "Duaration", "Data_up", "Data_down", "Local_up", "Local_down")
fmt.Println()
/*sort排序打印*/
var keys []string
m := static_imsi
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
var i int = 1
for _, k := range keys {
fmt.Printf("%-10d%-20s%-15v%-30v%-30v%-30v%-30v\n", i, k, m[k].Duaration, m[k].Data_up, m[k].Data_down, m[k].Local_up, m[k].Local_down)
i++
}
fmt.Println(strings.Repeat("*", 150))
}
}
/*話單文件按cell統(tǒng)計(jì)流量打印信息*/
func (cdr CdrFile) Static_cell_Printf(str string) {
len := len(flag.Args())
if len > 0 {
s := append(flag.Args(), str)
fmt.Println(strings.Repeat("*", 150))
fmt.Printf("%-10s%-20s%-30s%-30s%-30s%-30s\n", "sn", "cell", "Data_up", "Data_down", "Local_up", "Local_down")
fmt.Println()
/*sort排序打印*/
var keys []int
m := cdr.static_n_cell(s)
for k := range m {
kk, _ := strconv.Atoi(k)
keys = append(keys, kk)
}
sort.Ints(keys)
var i int = 1
for _, k := range keys {
kk := strconv.FormatInt(int64(k), 10)
fmt.Printf("%-10d%-20s%-30v%-30v%-30v%-30v\n", i, kk, m[kk].Data_up, m[kk].Data_down, m[kk].Local_up, m[kk].Local_down)
i++
}
fmt.Println(strings.Repeat("*", 150))
} else {
static_cell := cdr.static_cell(str)
fmt.Println(strings.Repeat("*", 150))
fmt.Printf("%-10s%-20s%-30s%-30s%-30s%-30s\n", "sn", "cell", "Data_up", "Data_down", "Local_up", "Local_down")
fmt.Println()
/*sort排序打印*/
var keys []int
m := static_cell
for k := range m {
kk, _ := strconv.Atoi(k)
keys = append(keys, kk)
}
sort.Ints(keys)
var i int = 1
for _, k := range keys {
kk := strconv.FormatInt(int64(k), 10)
fmt.Printf("%-10d%-20s%-30v%-30v%-30v%-30v\n", i, kk, m[kk].Data_up, m[kk].Data_down, m[kk].Local_up, m[kk].Local_down)
i++
}
fmt.Println(strings.Repeat("*", 150))
}
}
/*話單文件打印默認(rèn)信息*/
func (cdr CdrFile) Init_Printf() {
fmt.Println(strings.Repeat("*", 150))
fmt.Println(strings.Repeat("*", 150))
fmt.Println()
fmt.Printf("%75s\n", "話單解析工具v1.0.0")
fmt.Println()
fmt.Printf("%-20s\n", "使用方法:")
fmt.Println()
fmt.Printf("%-80s %-50s\n", "./Static -p test.dat [話單名,如:test.dat]", "打印一個(gè)話單")
fmt.Printf("%-74s %-50s\n", "./Static -p test.dat [話單名,如:test.dat] 1 [系列號(hào),如:1]", "按序列號(hào)打印一個(gè)話單")
fmt.Printf("%-81s %-50s\n", "./Static -p test.dat test1.dat test2.dat ...[多個(gè)話單名]", "打印多個(gè)話單")
fmt.Printf("%-78s %-50s\n", "./Static -p *.dat [匹配話單名,如:*.dat]", "打印匹配的話單")
fmt.Printf("%-80s %-50s\n", "./Static -i test.dat [話單名,如:test.dat]", "計(jì)算一個(gè)話單按imsi流量統(tǒng)計(jì)")
fmt.Printf("%-81s %-50s\n", "./Static -i test.dat test1.dat test2.dat ...[多個(gè)話單名]", "計(jì)算多個(gè)話單按imsi流量統(tǒng)計(jì)")
fmt.Printf("%-78s %-50s\n", "./Static -i *.dat [匹配話單名,如:*.dat]", "計(jì)算匹配話單按imsi流量統(tǒng)計(jì)")
fmt.Printf("%-80s %-50s\n", "./Static -c test.dat [話單名,如:test.dat]", "計(jì)算一個(gè)話單按cell流量統(tǒng)計(jì)")
fmt.Printf("%-81s %-50s\n", "./Static -c test.dat test1.dat test2.dat ...[多個(gè)話單名]", "計(jì)算多個(gè)話單按cell流量統(tǒng)計(jì)")
fmt.Printf("%-78s %-50s\n", "./Static -c *.dat [匹配話單名,如:*.dat]", "計(jì)算匹配話單按cell流量統(tǒng)計(jì)")
fmt.Println()
fmt.Println(strings.Repeat("*", 150))
fmt.Println(strings.Repeat("*", 150))
}
func main() {
var p, i, c string
var cdr CdrFile
flag.StringVar(&p, "p", "", "printf cdrs")
flag.StringVar(&i, "i", "", "static cdrs")
flag.StringVar(&c, "c", "", "static cdrs")
flag.Parse()
switch {
/*p不為空打印話單詳情*/
case p != "":
cdr.Printf(p)
/*i不為空,按imsi計(jì)算話單流量*/
case i != "":
cdr.Static_imsi_Printf(i)
/*c不為空,按cell計(jì)算話單流量*/
case c != "":
cdr.Static_cell_Printf(c)
/*默認(rèn)打印使用說(shuō)明*/
default:
cdr.Init_Printf()
}
}
GO:話單解析
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 覺(jué)得學(xué)到了很多以前沒(méi)有學(xué)到的東西!原來(lái)有些東西并不是像以往我們想象的那樣,也許我們可以過(guò)得更容易些!
- 項(xiàng)目地址 : https://github.com/zgljl2012/go-cli 編譯打包 使用git clo...
- go語(yǔ)言HTTP GET解析URL中的查詢參數(shù) 經(jīng)常我們會(huì)使用下面的邏輯來(lái)處理查詢參數(shù): 描述起來(lái)很簡(jiǎn)單,先獲取Q...
- 有的時(shí)候我們打開(kāi)工程后會(huì)碰到如下情況 解決辦法: 2、顯示包內(nèi)容 4、產(chǎn)出沖突文件(ps:這里要細(xì)心的找 ,文件很...