# 导表工具 **Repository Path**: YYMMYB/table-export-tool ## Basic Information - **Project Name**: 导表工具 - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-21 - **Last Updated**: 2026-10-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 将 csv 转换成 json 文件 和 可以加载json的 c# 字典. ## 输入 csv 文件 内部把csv读取到一个二维列表里, 主要在操作二维列表, 所以很容易扩展到excel ## 输出 - json 文件 - 把csv里的数据转成json格式存储(方便程序读取) - c# 文件 - 数据类, 每一列是一个字段 - 最外面的静态类, 每个静态字段都是字典, 代表一整张表 - 读取json的代码 ## 例子 输入: | | | | | | :-- | :--- | :--- | :------ | | - | id | 名称 | 颜色 | | | :i | \:s | \:s | | | $key | | | | - | 1 | 水 | #0095ff | | | 2 | 风 | #00ff49 | | | 3 | 火 | #ff1500 | | | 4 | 土 | #c501ff | 输出: 元素.cs ```cs public record class T_元素{ public int id; public string 名称; public string 颜色; } ``` Cfg.cs ```cs public static class Cfg { public static Dictionary 元素; public static void Load(IDataAccess access) { { var path = access.JoinPath(access.Root, @"./元素.json"); var json = access.GetString(path); 元素 = JsonSerializer.Deserialize>(json, JsonUtil.Options); } } } ``` 元素.json ```json {"1": {"id": 1, "名称": "水", "颜色": "#0095ff"}, "2": {"id": 2, "名称": "风", "颜色": "#00ff49"}, "3": {"id": 3, "名称": "火", "颜色": "#ff1500"}, "4": {"id": 4, "名称": "土", "颜色": "#c501ff"}} ``` # 使用方式 **!!!修改main.py中的路径!!!** **!!!修改main.py中的路径!!!** **!!!修改main.py中的路径!!!** 然后命令行执行 ``` python main.py ``` 如果没有安装依赖, 需要下载uv(一个python包管理器, 可能需要换源我记不住了), 并安装依赖 安装好uv后, 命令行执行 ``` uv sync ``` # csv表头格式 ## 一些说明 ### 基本类型 目前只支持4中: | 类型 | 标记 | | :-- | :-- | | int | :i | | string | \:s | | bool | :b | | float | :f | 目前不支持单格内写列表, 例如 `[1,2,3]` 是不支持的. 一个格子只有一个数据. (原因是字符串不好处理, 列表内的字符串需要判断是否用引号引起来了, 会有不同的处理. 而目前的字符串不需要解析, 是直接读取格子内的字符串, 无需也不支持引号) ### 表头和数据区域 必须在第一列用 `-` 来标记表头区域和数据区域的开始行 ### 键标记 用 `$key` 来标记键列, 会找到最近的集合, 并把它视为字典(而非列表) 如果一个集合没有 `$key` 则会被视为列表 支持多键字典 ## 嵌套类 可以正确识别嵌套的key csv | | | | | | :-- | :------- | :--- | :--- | | - | 基本信息 | | 等级 | | | id | 名称 | | | | :i | \:s | :i | | | $key | | | | - | 1 | a | 100 | c#类 ```cs public record class T_嵌套类{ public T_基本信息 基本信息; public int 等级; public record class T_基本信息{ public int id; public string 名称; } } ``` Cfg.cs 中的字段 ```cs public static Dictionary 嵌套类; ``` ## 多键字典 csv | | | | | | :-- | :--- | :--- | :--- | | - | id | 名称 | 等级 | | | :i | \:s | :i | | | $key | $key | | | - | 1 | a | 100 | c#类 ```cs public record class T_多键字典{ public int id; public string 名称; public int 等级; } public record class T_多键字典_Key{ public int 多键字典_id; public string 多键字典_名称; } ``` Cfg.cs 中的字段 ```cs public static Dictionary 多键字典; ``` ## 无键列表 csv | | | | | | :-- | :-- | :--- | :--- | | - | id | 名称 | 等级 | | | :i | \:s | :i | | - | 1 | a | 100 | c#类 ```cs public record class T_无键列表{ public int id; public string 名称; public int 等级; } ``` Cfg.cs 中的字段 ```cs public static List 无键列表; ``` ## 嵌套纵向字典(或列表) 末尾增加[] 带$key是字典, 不带是列表 可以处理多层嵌套 如果只是int类型的列表, 可以直接在 `嵌套字典[]` 的下一格写 `:i` csv | | | | | | :-- | :--- | :--------- | :--- | | - | id | 嵌套字典[] | | | | | 名称 | 等级 | | | :i | \:s | :i | | | $key | $key | | | - | 1 | a | 100 | | | | b | 200 | c#类 ```cs public record class T_嵌套纵向列表或字典{ public int id; public Dictionary 嵌套字典; public record class T_嵌套字典{ public string 名称; public int 等级; } } ``` Cfg.cs 中的字段 ```cs public static Dictionary 嵌套纵向列表或字典; ``` ## 嵌套横向字典(或列表) 以-开头, 新项起始列也用-标注 带$key是字典, 不带是列表 可以处理多层嵌套 如果只是int类型的列表, 可以直接在 `嵌套字典[]` 的下一格写 `:i` csv | | | | | | | | :-- | :--- | :-------- | :--- | :-- | :-- | | - | id | -嵌套字典 | | - | | | | | 名称 | 等级 | | | | | :i | \:s | :i | | | | | $key | $key | | | | | - | 1 | a | 100 | b | 200 | c#类 ```cs public record class T_嵌套横向列表或字典{ public int id; public Dictionary 嵌套字典; public record class T_嵌套字典{ public string 名称; public int 等级; } } ``` ## 派生类 在一行的末尾, 并以|开头表示派生类名, 纵向排列各个派生类 可以处理多层派生(但是例子没写) json文件的$type会在开头(c# 8.0及以前, 解析需要) csv | | | | | | :-- | :--- | :----- | :--- | | - | id | \|人类 | 语言 | | | :i | | \:s | | | $key | \|动物 | 体重 | | | | | :i | | - | 1 | 人类 | 中文 | | | 2 | 动物 | 10 | c#类 ```cs [JsonDerivedType(typeof(T_人类), typeDiscriminator: "人类")] [JsonDerivedType(typeof(T_动物), typeDiscriminator: "动物")] public record class T_派生类{ public int id; public record class T_人类 : T_派生类 { public string 语言; } public record class T_动物 : T_派生类 { public int 体重; } } ``` json ```json {"1": {"$type": "人类", "id": 1, "语言": "中文"}, "2": {"$type": "动物", "id": 2, "体重": 10}} ``` # c# 集成需要额外实现 需要额外实现 `IDataAccess` 接口, 在 `模板/Utils/IDataAccess.cs` 中 # 额外内容 ## Godot 我用 godot, 所以已经实现了 `IDataAccess` 接口, 在文件 `GodotDataAccess.cs` 中 ## 修改时自动生成 可以用python的 `watchfiles` 库, 以及vscode的task, 来自动监听文件变化, 并重新生成代码和json文件 写法参考 `.vscode/tasks.json` 文件