zoukankan      html  css  js  c++  java
  • MongoDB csv文件导入导出

    1.导出到csv文件:

      

      需要登录认证的:

    mongoexport -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin -d IndicatorPlatform -c calcgsdataflash -q{gscode:'ZTJB',ymd:{$gte:20190801,$lte:20190820}} --type csv -f gscode,gpcode,ymd,hms,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,time -o D:	mpTJB_20190820.csv

      

    2.从csv导入:

      

      需要登录认证的:

    mongoimport -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin -d IndicatorPlatform -c calcgsdataflash --type csv --headerline --file D:/tmp/ZTJB_20180716.csv

      

    数据经过csv导出导入,有一个非常隐蔽的问题,编写代码时需要注意:

      先导入一条数据:

        

    其中Price是double类型:

        

    然后我把该条记录导出到Demo.csv,并且从数据库删除该条记录,然后再从Demo.csv导入该条记录:

        

    再来看此时数据库中该条记录:

        

      发现Price数值原本double型66.000000自动变成了Int32型66。

      这时问题出现了,你如果还是用bson_iter_double(&iter)去取Price字段时,就会取不到值:

        

      只有用bson_iter_int32(&iter)才能取到值:

        

      所以得到结论

        当需要取数据中的某个float(或double)类型的字段时,代码可以如下编写:

        

        避免:数据经过 导出至csv再从csv导入的过程之后,字段值取不到的问题。

      总觉的上面的方法有点膈应,所以继续摸索,发现了2个新的API:

      测试代码编写如下:

      

     

      本以为bson_iter_value(&iter)->value.v_double 就可以解决问题,可断点发现如果是字段是Int32型,v_double的值并不能满足要求。

      如果要用这两个API,还得自己封装一层,把type和value对应起来。

      如:字段是BSON_TYPE_INT32就取value.v_int32的值; 是BSON_TYPE_DOUBLE就取value.v_double的值。

      

      仍然觉得上述方法很不爽,总是想寻求一种不依赖字段本身数据类型的取值方法。

      终于,Json完美满足了我的需求,测试代码如下:

      

      上述Json解析使用的是Jsoncpp,Jsoncpp使用方法详见

      http://www.cnblogs.com/SZxiaochun/p/5866401.html

      http://www.cnblogs.com/SZxiaochun/p/7684454.html

  • 相关阅读:
    Unity apk开机自启动一次
    Unity调用Android
    实验 1 Linux 系统的安装和常用命令
    课堂测试3第一阶段数据清洗
    Tutorial_6 运行结果
    Command 'ifconfig' not found, but can be installed with: sudo apt install net-tools VM Ubuntu 解决方案
    《规划极限编程》阅读笔记03
    软件工程_个人课程总结
    《规划极限编程》阅读笔记02
    学习进度_第十六周
  • 原文地址:https://www.cnblogs.com/SZxiaochun/p/5848787.html
Copyright © 2011-2022 走看看