GO:話單解析

// 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()
    }
}

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容