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

浙公网安备 33010602011771号