tabtoy的较详细导读,别错过了

关于tabtoy一些解析导读

** ( 关于tabtoy的一些解析导读,希望能作为参考,有点才疏学浅,可能有些方法有些地方描述的不太好,也希望有人帮忙一起改进,感谢你的浏览!!)

tabtoy是一个高性能表格数据导出工具,更新到V3版本,所以下列的对tabtoy工具的解析都是基于V3版本。
tabtoy主要由3部分构成,一是制表,二是导表,3是读表。我将分别讲述这3部分。以及还有一些携带的附加包例如测试,检查,报错等。

一、 制表:
tabtoy制表是于V3model包里的go中例如builtintypes.go,fieldtype.go等所制作,表的格式按照builtintypes.go里面内置表的类型制作,分为类型表,索引表和KV表。索引表又分为类型表,数据表以及键值表,在index.go中有关于索引表的代码设计(如果要添加字段和枚举, 需要在model.InitBuiltinTypes函数中添加入口),类型表的代码设计在type.go中。
字段类型的设计在fieldtype.go中,如果需要添加新的字段类型,需要在此定义新的类型。
关于model包的方法介绍:
1–builtintypes.go
(内置表的类型,建立类型表,索引表,KV表 )
InitBuiltinTypes 方法返回一个typetab

2–cell.go
(拷贝单元格的内容在新建立的表中)
拷贝方法 CopyFrom
打印文件名+表名+值 String

3–datarow.go
得到data中的单元格内容 Cells()
得到单元格的列数 Cell(col int)
添加单元格内容在data中 AddCell()
判断内容是否为空 IsEmpty()
新建一个dataRow newDataRow(这个不怎么确定)

4–datatab.go
得到重复列的数量 ArrayFieldCount
排除表头的数据索引 DataRowIndex() (模板代码)
得到做一个表格的数据 String()
得到表头的列数 HeaderByColumn
得到表头的名字 HeaderByName
得到行数 AddRow()
得到单元格内容 MustGetCell
根据列头找到该行对应的值 GetValueByName

5–datatablist.go
找tab类型 GetDataTable
加入table数组 AddDataTable
返回所有的data数据 AllTables()
得到data的长度 Count()
6–fieldtype.go
将表中输入的字段类型转换为各种语言类型(加入新的类型时需要在此定义新的语言类型)//自动执行该函数
取类型的默认值 FetchDefaultValue函数
将类型转为对应语言的原始类型 LanguagePrimitive函数
原始类型是否存在,例如: int32, int64 PrimitiveExists函数
判断是否是bool类型ParseBool
7–globals.go
读取结构体数据用的
8–header.go
得到表头的单元格内容以及对应的类型信息 String()
9–index.go
//如果要添加字段和枚举, 需要在model.InitBuiltinTypes函数中添加入口,(函数在builtintypes.go内)
匹配tagstb_name:"标记" // | 分割 MatchTag
10–type.go
//如果要添加字段和枚举, 需要在model.InitBuiltinTypes函数中添加入口,(函数在builtintypes.go内)
定义表内数据格式(大概)
11–typetab.go
得到类型表对应源表的位置信息 AddField
得到table表对应行字段 AllFields()
判断类型是否是枚举 IsEnumKind
匹配枚举类型并得到第一个枚举字段类型 方法 ResolveEnum
匹配枚举值 ResolveEnumValue
获取所有的结构体名 rawStructNames
获取所有的枚举名 rawEnumNames
获取对象的所有字段 AllFieldByName
获取数据表中表头对应类型表 FieldByName

二、导表:
Tabtoy的导表基于V3文件中的example包中,里面有csharp,golang,java,lua等例子导出表格数据/类型/源码,主要讲一下golang中导出表格的方法。
Golang中的main函数表加载前清除之前的手动索引和表关联数据,然后加载并构建索引,(具体的结构在table_gen.go中书写,如果需要增加一些字段内容类型,如技能cd,技能增益之类的需要在此改写。)表加载和构建索引后,需要手动处理数据的回调。
关于golang的方法介绍
1.main.go
重新加载指定文件名的表 ReloadTable(filename string)
main() 加载表的数据(例子代码)
2.table_gen.go
初始化表实例 NewTable()
构建索引,调用 PostHander BuildData()
调用PreHander,清除索引和数据 ResetData()
注册加载前回调(用于清除数据) RegisterPreEntry
注册加载后回调(用于构建数据) RegisterPostEntry

三、读表:

这里介绍tabtoy中的读表是读取表格一些方法以及转化为二进制码还有json序列输出相关的go文件。
读取表格基于V3文件中的compiler包中,(但同时引用了v3文件中helper包,V3特性之一支持Xlsx/CSV作为表格数据混合输入通过helper包内的代码实现的)。
(1) 关于compiler包内方法介绍:
1.flow.go
加载多种表并合并所有的KV表,所有的数据表 Compile

2.header.go
找到表类型名字 headerValueExists
解析表的类型 resolveHeaderFields
检查原始类型 checkHeaderTypes
读取表头(带有以上功能) Loadheader

3.merge.go
添加数组列的元素入单元格内 combineRepeatedCell
将不同文件/Sheet/KV转换的表,按照表头类型合并数据输出 MergeData
创建要输出的表 createOutputTable

4–resolverow.go
匹配表头所在位置 matchField
将一行数据解析为具体的类型 ParseRow

5–strtovalue.go
把value转化为原始类型的值同时内建类型定义与model.InitBuiltinTypes是否匹配 StringToValue

6–tab_data.go
读取一行的数据 readOneRow
加载datatable里的数据 LoadDataTable

7–tab__index.go
确定表的类型TableType parseIndexRow
读取并加载的表的数据,按照表类型排序,先读类型表 LoadIndexTable

8–tab_kv.go
把KV表转成data数据输出 transposeKVtoData

9–tab_type.go
读取并加载类型表数据 LoadTypeTable

10–variant.go
遍历读取加载所有表,并分类储存 loadVariantTables

(2)关于helper包方法介绍:
1–fileloader.go
添加路径 AddFile
储存文件路径 Commit()
匹配当地文件的路径类型 loadFileByExt
得到当地文件的路径类型 GetFile
新建文件路径 NewFileLoader

2–filewriter.go
创建一个新的文件,写入数据 WriteFile

3–memfile.go
查看文件内所有的文件名字 VisitAllTable
存文件名字于新数据文件中 AddFile
创建一个新的xlsx文件 CreateXLSXFile
创建一个新的CSV文件 CreateCSVFile
匹配文件名 GetFile
新建内存文件Memfilemap NewMemFile()

4–sheethelper.go
得到单元格内容的值 GetSheetValueString
判断是否整行都是空的 IsFullRowEmpty
把表头类型写入map文件存储 WriteIndexTableHeader
把字段等类型写入map文件存储 WriteTypeTableHeader
把值写入map文件存储 WriteRowValues
读取csv文件内容于新一个输出的csv文件中 ConvertToCSV

5–tab_csv.go
往records写入value WriteRow
往rowdata写value,写成功为true SetValue
得到某行某列的value GetValue
判断是否整行都是空的 IsFullRowEmpty
新建一个CSV文件 NewCSVFile()
读取csv文件名及内容 Load
保存csv内容 Save
把cell内容转化为string存入record中 Transform
把GBK转化为UTF8 解码 ConvGBKToUTF8
把UTF8转化为GBK 编码 ConvUTF8ToGBK

6–tab_xlsx.go
往cell加入value WriteRow
得到 取列头所在列和当前行交叉的单元格的值 GetValue
判断是否整行都是空的 IsFullRowEmpty
往新建的file.sheets加入sheets FromXFile
读取filename名同时存入sheets Load
保存xlsx内容 Save

7–tabfile.go
读取sheet的内容 ReadSheetRow

转化二进制码输入基于gen包中的bindata中,(如果需要加新的类型也需要在此代码改写)gen包中还有一些cssrc,gosrc,javasrc,luasrc一些用不同语言生成json序列化输出的代码。这里只挑gosrc作为例子解析.
gosrc的解析

1.func.go
init()得到模板UseFunc
自带函数(
func(tf *model.TypeDefine) string 将定义用的类型,转换为不同语言对应的复合类型
func(fieldType *model.TypeDefine) string 总结字段类型
func() string 返回序列化后的string

2.gen.go
将给定的字符串作为字节序列写入 Generate

3.test.go(不可编辑)
测试代码

(3)关于bindata包内方法介绍:
1–gen.go
写表头出现的错误 writeHeader
把表中的内容都转化为二进制数据 Generate
2–struct.go
把表中的一行字段内容转化为二进制数据写入新的表中 writeStruct
3–tag.go
得到字段的二进制数据 MakeTag
结构体默认数组的二进制类型的数据 MakeTagStructArray()
转化字段类型的标签的二进制数据 writePair
4–value.go
把字段类型转化为二进制数据方法 (把write.go方法结合一起) writeValue
5–writer.go
内有转化详细字段类型的每个方法

四、附加包
(1) Util包(一些小转化需要用上的包)内方法介绍:
1–strwrapper.go
改写一下字符串里面一些特殊符号的格式 如\n改为\n StringEscape
把s打印成\s\格式 StringWrap

2–rc2a.go
按excel格式 R1C1格式转A1 相当于1->A ,27->AA index2Alphabet

3–conv.go
将字符串转化为对应的基本类型 StringToPrimitive

4–changeext.go
改变新的ext路径 ChangeExtension

5–cache.go
没补充好

(2)V3内Tests 测试包内方法介绍:

1.data_test.go
测试表的生成 TestDisableDataRow (添加数据类型需要在这添加新的类型)
表头字段重复 TestDuplicateHeaderField
生成多列数组 TestArrayList
测试数组类型多列跨表定义是否一致 TestArrayMultiColumnDefineNotMatch
创建索引时的重复性检查 TestRepeatCheck
单元格中有切割符时, 重复列的拆分符需要单独设置 TestArraySpliter

2.emulator.go
新建个文件仿真器 NewTableEmulator
测试运行时的错误提示 MustGotError
验证类型表的json序列化是否有错误 VerifyType
验证数据表的json序列化是否有错误 VerifyData
验证测试时启动程序时输出数据序列化与反序列化是否会出现问题 VerifyGoTypeAndJson
创建一个文件写入数据data genFile
比较KV的序列号是否一样 compareKVJson
比较数组的序列号是否一样 compareArrayJson

3.launcher.go
应用程序的启动的布局文件 compileLauncher
多线程主程序 读取要输出文件序列化然后输出

4.type_test.go
类型字段重复 TestDuplicateTypeFieldName
多表中的类型字段重复 TestDuplicateTypeFieldNameInMultiTypesTable
不填枚举值报错 TestEnumValueEmpty
枚举值重复报错 TestDuplicateEnumValue
枚举值 TestEnumValue
非法枚举值 TestInvalidEnumValue
枚举值为空 TestEmptyEnumValue
基础类型并创建test文件 TestBasicType (若添加新类型这里需要改写一下)
禁用索引表和类型表的行 TestDisableIndexAndTypeRow

(3)V3内report包方法介绍:
errid.go
一些错误报告语句
error.go
匹配错误报告 getErrorDesc
Error() 创建错误语句string
打印错误报告 ReportError
log.go
自动运行log图标

(4)V3内checker包方法介绍:
1–checker_data.go
检查数据与定义类型是否匹配 checkDataType
检查单个数据是否与定义类型匹配 checkSingleValue (新添加类型也需在此添加类型)

2–check_enumvalue.go
检查枚举类型的解析 checkEnumValue
检查枚举值是否存在有效 checkEnumFieldValue

3–check_repeat.go
检查重复单元格内容(重名) checkRepeat

4–checker_type.go
检查枚举值是否为空 typeTable_CheckEnumValueEmpty
检查枚举值是否重复 typeTable_CheckDuplicateEnumValue
综合检查上述两个 CheckType

5–entry.go
预先检查未合并前的数据表检查是否有空类型,是否匹配多列数组类型 PreCheck
合并后检查 PostCheck(checkEnumValue。checkRepeat。checkDataType)

五、后续
关于V3新增的支持JSON/Golang/C#/Java/Lua/二进制 源码, 数据, 类型输出在entry_v3.go包中。

(下面是tabtoy的主程序)
主程序:

 - [ ] package main
       
       import (          //引用了flag,fmt,os等包; 	
       "flag"            //解析命令行参数的包 	
       "fmt" 	
       "github.com/davyxu/golog"   //一个日志库的包
       	"github.com/pkg/profile"     //一个启动性能分析包 	"os"                  
       //用来针对用户所用的操作系统的相关操作 )
       
       var log = golog.New("main")  //新建一个日志
       
       const ( 	Version = "3.0.1" )
       
       var enableProfile = false
       
       func main() {
       
       	flag.Parse()        //解析命令行参数到定义的flag
       
       	// 版本 	if *paramVersion
       	 {            
       	 		fmt.Printf("%s",   Version) 	
       	 			return 
       	}
       
       	switch *paramMode { 
       		case "v3":
       
       		type stopper interface { 			Stop()1 		}
       
       		var s stopper
       
       		if enableProfile {   
       			s =  profile.Start(profile.CPUProfile, profile.ProfilePath(".")) 	 //开始性能分析,返回一个停止接口s 	
       	}
       
       		V3Entry()         
       
       		if s != nil { 			s.Stop() 		} 
       			case "exportorv2", "v2":
       		V2Entry() 
       			case "v2tov3": 		V2ToV3Entry() 
       		default:
       		fmt.Println("--mode not specify") 	
       			os.Exit(1)    // 直接退出, 不抛异常, 不执行相关清理工作 	
       			}
       
       }

关于tabtoy的一些解析导读,希望能作为参考,有点才疏学浅,可能有些方法有些地方描述的不太好,也希望有人帮忙一起改进,感谢你的浏览!!希望在评论区能留下你们宝贵的建议,谢谢!!

我是慢雨,感谢你的浏览!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值