Skip to content

Instantly share code, notes, and snippets.

@larryzhao
Last active April 9, 2016 15:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save larryzhao/a3f62e7a46357af5de8b04b08fe46894 to your computer and use it in GitHub Desktop.
Save larryzhao/a3f62e7a46357af5de8b04b08fe46894 to your computer and use it in GitHub Desktop.

###如何导入原始数据

  • 查看导入原始数据配置是否正确,配置应该存在于项目 preprocess/sql 目录下面,文件名叫 config.json
  • 运行 preprocess 项目
  • 点击 导入数据
  • 选择存放原始数据文本文件的文件夹,就可以开始导入
  • 原始数据文本文件的文件名需要和配置中写明的完全一致。

###如何修改原始数据文件编码

根据之前经验,615给出的数据文件都是WINDOWS2312编码的,需要改成UTF-8编码。改动步骤如下:

  • 右键点击文本文件,使用记事本打开
  • 点击记事本菜单 -> 文件 -> 另存为
  • 下方编码处如果显示ANSI说明此编码有问题,把这个选择改为UTf-8并且保存即可。

###如何检查临时数据文件目录权限 导入数据过程需要输出临时数据文件,这个路径在当前项目路径下的 preprocess/sql/tmp 需要确认他拥有需要的权限。

  1. 找到项目文件夹下 preprocess/sql/tmp
  2. 右键 -> 属性 -> 安全 -> 编辑 -> 添加
  3. 输入 Authenticated -> 检查名称
  4. 点击确定
  5. 勾上所有的勾,点击确定

###如何修改导入原始数据配置

原始数据配置文件是 .json 格式的文本文件,如果有需要可以直接修改,见下图:

{                                                              // 开头和结尾必须由大括号包裹
  "tables": [                                                  // tables: [] 表示由 [] 包裹的这是一个叫 tables 的数组
    {                                                          // 这个数组里面每一个大括号都代表一个原始数据表的配置
      "txtFileName": "absolute_nav_data_fused.txt",            // 原始数据文件文件名
      "tableName": "ac_nav_data_raw",                          // 原始表名
      "skipLinesCount": 8,                                     // 原始数据文件中最前面有多少条是废的
      "leadingFieldsCount": 18,                                // 每行前面有多少个数据是不会在这一行里重复的
      "nonRepeatedFields": {                                   // 在这个大括号里列出每一个不重复数据域,并注明它的序号,下标从1开始
        "time": 1,
        "msg_publish_time_ac_nav": 2,
        "ac_pitch": 3,
        "ac_roll": 4,
        "ac_true_heading": 5,
        "plat_to_body_matrix_xx": 6,
        "plat_to_body_matrix_xy": 7,
        "plat_to_body_matrix_xz": 8,
        "plat_to_body_matrix_yx": 9,
        "plat_to_body_matrix_yy": 10,
        "plat_to_body_matrix_yz": 11,
        "plat_to_body_matrix_zx": 12,
        "plat_to_body_matrix_zy": 13,
        "plat_to_body_matrix_zz": 14,
        "ac_position_latitude": 15,
        "ac_position_longitude": 16,
        "ac_height": 17,
        "ac_baroref_altitude": 18                             // 每个大括号里面最后一个元素最后不要带逗号
      },
      "boolFields": [                                         // 有哪些数据域是布尔类型的,把名字写在这里
        "bool_field1",
        "bool_field2"                                         // 每个中括号最后一个元素后面不要带括号
      ],
      "varcharFields": [                                      // 有哪些数据是字符串类型的,把他们的名字写在这个中括号里

      ],
      "repeatedFields": {
      },
      "addFields": {                                          // 有哪些字段需要在导入后加上一个固定数值的,写在这个大括号里
        "time": "33000"
      },
      "divFields": {                                          // 有哪些字段需要在导入后除以一个固定数值的,写在这个大括号里
        "msg_publish_time_ac_nav": "1000000000",
        "ac_pitch": "1000",
        "ac_roll": "1000",
        "ac_true_heading": "1000",
        "ac_position_latitude": "1000",
        "ac_position_longitude": "1000"
      },
      "mulFields": {                                          // 有哪些字段需要在导入后乘以一个固定数值的,写在这个大括号里
      },
      "timeFields": [                                         // 指定哪些数据域是时间数据,导入时会进行时间处理
        "time"
      ],
      "uniqueIndexedFields": [                                // 指定这个表的唯一索引,这个一般来讲你们不要动
        "time"
      ],
      "skipFields": [                                         // 指定需要略过的 field,这样这个 field 在数据文件中的数据将被忽略
        "foobar"
      ]
    },
    
    // 更多的表配置
  ]
}
  • 每次改完 json 可以把全部文本贴到: http://jsonlint.com/ 进行 json 验证,看看是不是符合规范。

###当有新数据文件来的时候,如何调试数据录入程序

#####检查配置是否正确读入 断点到 for (vector<TableConfig>::iterator itr = tableConfigs.begin(); itr != tableConfigs.end(); ++itr) 检查 tableConfigs 里面是否正确有值,数量是否与配置中表的数量相符 这个循环每一次循环会完全处理一张表的导入

#####检查路径是否正确存在 断点到 stringstream log; 检查 txtFileName txtFilePath dataFilePath 所指向的路径是否存在

#####检查从原始文件读入 断点到 int repeatedCount; 检查上面的 tokens 里面是否有值,这里面是一行数据按照空格拆分后的数据,最终入库数据从这里来。 如果这里没有,很可能是因为原始数据编码导致

#####检查数据导入

  • 断点到 sql = "COPY " + tmpTableName + " FROM '" + dataFilePath + "' (FORMAT csv)"; 检查之前 dataFilePath 是否存在文件,文件是否有内容。数据是通过这个文件导入数据库表的。
  • 断点到 wstring err = utility::UTF8ToUnicodeWString(string(PQresultErrorMessage(res)));, 如果能够运行到这里,说明导入出错,往下运行一步之后看 err 中的错误描述
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment