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