###如何导入原始数据
- 查看导入原始数据配置是否正确,配置应该存在于项目 preprocess/sql 目录下面,文件名叫 config.json
- 运行 preprocess 项目
- 点击
导入数据
- 选择存放原始数据文本文件的文件夹,就可以开始导入
- 原始数据文本文件的文件名需要和配置中写明的完全一致。
###如何修改原始数据文件编码
根据之前经验,615给出的数据文件都是WINDOWS2312
编码的,需要改成UTF-8
编码。改动步骤如下:
- 右键点击文本文件,使用记事本打开
- 点击记事本菜单 -> 文件 -> 另存为
- 下方编码处如果显示
ANSI
说明此编码有问题,把这个选择改为UTf-8
并且保存即可。
###如何检查临时数据文件目录权限
导入数据过程需要输出临时数据文件,这个路径在当前项目路径下的 preprocess/sql/tmp
需要确认他拥有需要的权限。
- 找到项目文件夹下
preprocess/sql/tmp
- 右键 -> 属性 -> 安全 -> 编辑 -> 添加
- 输入 Authenticated -> 检查名称
- 点击确定
- 勾上所有的勾,点击确定
###如何修改导入原始数据配置
原始数据配置文件是 .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
中的错误描述