golang读取文件信息插入mongodb

   这几日,在项目中顺手做了一个功能,读取手机归属地信息,然后插入mongodb

   手机归属地格式

号码 省份 城市 卡型 区号
130001 江苏 常州 江苏联通 0519

 

  代码如下

package main
 
import (
    "encoding/csv"
    "encoding/json"
    "fmt"
    "io"
    "labix.org/v2/mgo"
    "os"
    "runtime"
)
 
/*
初始化配置
*/
func init() {
    file, _ := os.Open("config.json")
    buf := make([]byte, 2048)
 
    n, _ := file.Read(buf)
    fmt.Println(string(buf))
    err := json.Unmarshal(buf[:n], &config)
    if err != nil {
        panic(err)
        fmt.Println(err)
    }
}
 
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    ImportPhoneInfo()
}
 
var config Config = Config{}
 
var worker = runtime.NumCPU()
 
//手机号码
type PhoneArea struct {
    Phone     string "PhoneStart"
    Area      string "Province"
    City      string "City"
    PhoneType string "PhoneType"
    Code      string "Code"
}
 
//配置
type Config struct {
    MongodbServer string
    PhoneareaFile string
}
 
/*导入手机地理信息*/
func ImportPhoneInfo() {
    var chanPhoneArea = make(chan PhoneArea)
    // 标记完成
    dones := make(chan struct{}, worker)
 
    //读取文件信息
    go addPhoneInfo(chanPhoneArea)
    //插入mongodb
    for i := 0; i < worker; i++ {
        go doPhoneInfo(chanPhoneArea, dones)
    }
    //等待完成
    awaitForCloseResult(dones)
    fmt.Println("插入完毕")
}
 
/*
获取手机地理信息
*/
func addPhoneInfo(chanPhoneArea chan<- PhoneArea) {
    file, err := os.Open(config.PhoneareaFile)
 
    if err != nil {
        fmt.Println("打开文件失败", err)
        return
    }
    defer file.Close()
    fmt.Println("读取手机地理信息文件")
    reader := csv.NewReader(file)
 
    for {
        line, err := reader.Read()
 
        if err == io.EOF {
            close(chanPhoneArea)
            fmt.Println("手机地理信息文件读取完毕")
            break
        } else if err != nil {
            close(chanPhoneArea)
            fmt.Println("Error:", err)
            break
        }
        phonearea := PhoneArea{line[0], line[1], line[2], line[3], line[4]}
        chanPhoneArea <- phonearea
    }
}
 
/*
插入信息到mongodb
*/
func doPhoneInfo(chanPhoneArea <-chan PhoneArea, dones chan<- struct{}) {
    //开启loop个协程
 
    session, err := mgo.Dial(config.MongodbServer)
    if err != nil {
        fmt.Println("错误")
        panic(err)
        return
    }
    defer session.Close()
    c := session.DB("Test").C("PhoneAreaInfo")
 
    for phonearea := range chanPhoneArea {
        fmt.Println("插入:", phonearea)
        c.Insert(&phonearea)
    }
 
    dones <- struct{}{}
}
 
func awaitForCloseResult(dones <-chan struct{}) {
    for {
        <-dones
        worker--
        if worker <= 0 {
            return
        }
    }
}

  

配置文件config.json

{
    "MongodbServer" : "127.0.0.1",
    "PhoneareaFile" : "phonearea.txt"
}

  

手机地理信息 phonearea.txt

号码,省份,城市,卡型,区号
1300000,北京,北京,北京联通GSM卡,010
1300001,江苏,常州,江苏联通如意通卡,0519
1300006,江苏,南京,江苏联通GSM卡,025
1300010,北京,北京,北京联通GSM卡,010
1300011,北京,北京,北京联通GSM卡,010
1300012,天津,天津,天津联通GSM卡,022
1300013,天津,天津,天津联通GSM卡,022
1300014,天津,天津,天津联通GSM卡,022
1300015,山东,淄博,山东联通GSM卡,0533
1300016,山东,烟台,山东联通GSM卡,0535
1300017,山东,济南,山东联通GSM卡,0531
1300018,天津,天津,天津联通GSM卡,022
1300019,天津,天津,天津联通GSM卡,022
1300020,上海,上海,上海联通GSM卡,021
1300021,上海,上海,上海联通GSM卡,021
1300022,上海,上海,上海联通GSM卡,021
1300023,上海,上海,上海联通GSM卡,021
1300024,上海,上海,上海联通GSM卡,021
1300025,江苏,南京,江苏联通GSM卡,025
1300026,江苏,南京,江苏联通GSM卡,025

  

  

posted @   我想我是青蛙  阅读(2056)  评论(0编辑  收藏  举报
编辑推荐:
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
阅读排行:
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析
· 上周热点回顾(3.24-3.30)
点击右上角即可分享
微信分享提示