导表工具
确认怎么写导表工具需要先确定开发环境,数据存储结构.
假设采用的数据载体是csv
如果没有编译成本比如python这样的脚本语言,做法很简单:(假设使用的是python)
1.解析csv文件,读到内存中来叫做sheet_map
2.通过读出来的sheet_map写成python代码
3.写一些通用的读数据函数
细节:
目录结构:
tool
csv----------用于存放csv文件
tplfile-------用于存放模板文件
midfile------用于存放中间文件
outfile------用于存放最终文件
csv文件不用说就是策划填写的数据表格
tplfile是模板,主要是策划数据表和数据类型的映射关系
比如 tpl = {
"编号":("id", TO_INT, ),
"名字":("name", TO_STR, ),
"职业":("sch", TO_INT, ),
}
midfile是中间文件,也就是上面说的sheet_map,是从csv中读出来的数据,这里可以把所有的数据都存成string,这一步不需要考虑数据类型
比如 sheet_map = {
1:("name":"test", "sch":"1", ),
}
outfile是最终的文件通过模板解析sheet_map,最终写的py文件,有了sheet_map和tpl就可以很轻松的分析出来name的类型是string,sch的类型是int
data = {
1:("name":"test", "sch":1),
}
如果有编译成本,比如C++
1.工具依然选择用python写,解析svn,load到内存一个sheet_map
2.因为是c++所以不能直接使用sheet_map,这是要写成文件,提供给C++使用,假设叫做data_table
3.读data_table和tpl文件分析每个数据的类型写成头文件
比如
xxx.h
1 struct xxx{ 2 std::string name; // 名字 3 int sch; // 职业 4 }; 5 6 typedef std::map<int, xxx> xxx_pool; 7 8 bool load_xxx();
这里一定不要赋值,不然表格少做修改,而带来的编译代价是很大的,所以写一个load的函数
4.通过头文件和tpl写源文件
比如
static xxx_pool s_xxx; bool load_xxx() { auto table = openTable("midfile/xxx.data"); if ( !table ) return false; for ( auto iter : (*table) ) { xxx v; int key; (*iter) >> key; parse_data(v.name, "name", iter); // 名字 parse_data(v.sch, "sch", iter); // 职业 s_xxx[key] = v; } return true; }
5. cpp中包含一个common.h,这个文件不是生成的,是本地存在的一些同用函数,用来实现openTable和parse_data
template<typename T> void parse_data(T & v, const std::string & field, DataTablePtr value); void parse_data(int & prev, const std::string & field, DataTablePtr value); DataTablePtr openTable(const std::string & filename);
over