由于最近项目需要,不得不读取 .bson 文件,网上都是读取 json 的,关于 bson 的几乎没有!!折腾了两天,最终整理出个路子,如下:
首先是通过 JavaScript 读取的,为啥要用这个语言,不知道不清楚不了解!!!好吧,实际上是 libbson(C++)没搞出来,一没文档,二没帖子,看源码也没看出个所以然;Python 就更别说了(┭┮﹏┭┮被逼地简直头皮发麻***)
要说明的是,我是需要读取 .bson 文件中的特定内容,也就是指定元素的值。 libbson 提供了掰着手指头都能数得过来的几个例子,有一个是可以读取bson文件然后输出到命令行的,是一股脑地输出,不想要的也输出,而且没有层次,长下面这鬼样纸:
所以最终还是用 JS 实现的。
JS无需编译,直接运行 .js 文件即可。这里是通过 Node.js (一个方便使用 JavaScript 的环境)实现的,使用方法如下:
node bson_gao.js gao.bson 789.txt
node 就是用 Node.js 启动,bson_gao.js 是我编写的读取 bson 文件的脚本,gao.bson 是要读取的文件,123.txt 是最终要存储数据的文件。
运行这个指令后会出现一堆莫名其妙的文件,本人不是专业搞 JS 的,所以也不清楚运作机理,不过这些都不重要。重要的是,程序会读取 gao.bson 文件,然后把需要读取的数据存入 123.txt。
运行代码前,当然要先装上 Node.js,并且在里面下载好 fs 和 bson 模块,这个网上搜一下有很多资料的。
bson_gao.js 代码如下:
1 const fs = require("fs"); 2 const bson = require('bson'); 3 4 var fileName = process.argv.splice(2); //读取命令行输入参数,从第3个开始 5 console.log("读取内容为 : "); 6 fs.readFile(fileName[0].toString(), 7 function(err,data){ 8 if(err){ 9 console.error(err); 10 } 11 else{ 12 var mappoints = bson.deserialize(data); 13 let mapPointsCount = 0; 14 15 for(let pointIndex in mappoints){ 16 let pos = getPosition(mappoints[pointIndex][