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 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析
· 上周热点回顾(3.24-3.30)