分享
  1. 首页
  2. 文章

golang读取文件信息插入mongodb

zsbfree · · 13343 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这几日,在项目中顺手做了一个功能,读取手机归属地信息,然后插入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

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:zsbfree

查看原文:golang读取文件信息插入mongodb

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
13343 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏