# Toyota EPC 数据库转换字典

日期：2026-06-19  
数据源：`D:\TMCEPCW3\epcdata`

这份文档的目的：把 Toyota EPC 原始文件转换成你自己的数据库。  
这里说的“每一个文件”，按文件结构家族说明，不是逐个列出几十万个重复文件。

## 读取规则

字段位置用这个格式：

```text
0:10 = 从第 0 位开始，到第 10 位结束，不包含第 10 位。
```

大部分 `.DAT` 是固定长度记录，可以直接批量切开。  
多数 `.IA0/.IA1/.IA2` 是原 EPC 程序自己的索引。转自己的数据库时可以导入，也可以忽略后重建数据库索引。

## 目录层级

```text
D:\TMCEPCW3\epcdata
├─ EU    经典 EPC 地区数据
├─ GR    经典 EPC 地区数据
├─ JP    经典 EPC 地区数据
├─ US    经典 EPC 地区数据
├─ FL    车型级压缩/编码数据
└─ JPIO  明文 CSV + JPG 附件/用品资料
```

建议先转换：

```text
EU / GR / JP / US
```

然后再处理：

```text
JPIO
FL
```

## 一、地区根目录公共表

这些文件位于：

```text
D:\TMCEPCW3\epcdata\{地区}\
例如：D:\TMCEPCW3\epcdata\GR\
```

### 1. `VIN9.INI`

作用：VIN 前三位 WMI / 前缀规则。

示例：

```text
4T2
6T1
8AJ
AHT
JTD
MR0
SB1
```

建议表：`vin_prefixes`

| 字段 | 说明 |
|---|---|
| `region` | 地区，例如 `GR` |
| `prefix` | VIN 前三位 |
| `source_file` | 原始文件路径 |

状态：已确认，可直接入库。

### 2. `FRAMNO.DAT`

作用：车架号范围表。它不是完整 17 位 VIN 明细库，而是基础底盘 + 年份 + 流水号范围。

记录长度：`99` 字节。

建议表：`vin_ranges`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:7` | `frame_code` | 基础底盘，例如 `A200A`、`GUN125` |
| `7:11` | `year` | 年份 |
| `11:95` | `serial_points_raw` | 12 组流水号范围/节点，每组 7 位 |
| `95:99` | `suffix_raw` | 附加标记，暂时原样保存 |

建议拆分：

```text
serial_01 = 11:18
serial_02 = 18:25
...
serial_12 = 88:95
```

状态：已确认，可直接入库。

### 3. `HINMEI01.DAT / HINMEI03.DAT / HINMEI04.DAT / HINMEI05.DAT`

作用：零件名称字典。

记录长度：`66` 字节。

语言：

| 文件 | 语言/编码 |
|---|---|
| `HINMEI01.DAT` | 中文，GB18030/GBK |
| `HINMEI03.DAT` | 法语/拉丁编码 |
| `HINMEI04.DAT` | 德语/拉丁编码 |
| `HINMEI05.DAT` | 西语/拉丁编码 |

建议表：`part_names`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:6` | `reference_code` | 参考号，例如 `48510`、`48510A` |
| `6:66` | `name` | 零件名称 |

示例：

```text
48510 右前减振器总成
48520 左前减振器总成
```

状态：已确认，可直接入库。

### 4. `FIGMEI01/03/04/05.DAT`

作用：图组名称字典。

记录长度：`93` 字节。

建议表：`figure_group_names`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:4` | `figure_group` | 图组，例如 `4803` |
| `4:93` | `figure_name` | 图组名称 |

示例：

```text
4803 RESSORTS ET AMORTISSEUR AVANT
```

注意：少数行可能是说明/续行，导入时建议保留 `raw_text`。

状态：基本确认，可直接入库。

### 5. `HINCLR.DAT`

作用：颜色/内饰色/色码字典。

记录长度：`37` 字节。

建议表：`color_names`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:12` | `color_key` | 零件/颜色组合键 |
| `12:37` | `color_name` | 颜色名称 |

示例：

```text
023288610201 BLACK
023288610204 BLUE
```

状态：基本确认，可直接入库。

### 6. `RYAKUG01/03/04/05.DAT`

作用：缩写解释字典。

记录长度：`168` 字节。

建议表：`abbreviations`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:168` | `raw_text` | 原始解释文本 |

建议处理方式：

```text
先整行导入 raw_text。
后续再用规则抽取 abbreviation 和 description。
```

状态：可入库，但字段切分仍需继续优化。

### 7. `CHOHIN.DAT`

作用：零件关联/替换/历史关系之一。当前可按固定结构入库，但业务含义仍需验证。

记录长度：`43` 字节。

建议表：`part_relation_chohin`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:12` | `part_no_a` | 零件号 A |
| `12:15` | `relation_code` | 关系代码 |
| `15:27` | `part_no_b` | 零件号 B |
| `27:35` | `date_code` | 日期/年月代码 |
| `35:43` | `reserved` | 保留 |

示例：

```text
0400111148  100040011340E  201103**
```

状态：结构确认，业务含义待验证。

### 8. `DAIHIN.DAT`

作用：零件替代/代替关系之一。当前可按固定结构入库，但业务含义仍需验证。

记录长度：`41` 字节。

建议表：`part_relation_daihin`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:12` | `part_no_a` | 零件号 A |
| `12:27` | `part_no_b` | 零件号 B |
| `27:41` | `date_relation_raw` | 日期/关系原始字段 |

示例：

```text
0001900025  999990001907283  011999031801
```

状态：结构确认，业务含义待验证。

### 9. `SHAMEI.ACD / JOHO*.ACD / OVCFH*.ACD`

作用：原程序用的压缩/编码资料包。

建议表：`raw_acd_files`

| 字段 | 说明 |
|---|---|
| `region` | 地区 |
| `file_name` | 文件名 |
| `file_path` | 路径 |
| `file_size` | 大小 |
| `raw_blob` | 可选，是否保存二进制 |

状态：未解码。不建议作为第一阶段核心数据。

## 二、车型目录文件

这些文件位于：

```text
D:\TMCEPCW3\epcdata\{地区}\{目录}\
例如：D:\TMCEPCW3\epcdata\GR\672390\
```

目录里的主要文件家族：

```text
FGI / BZI / EMI / EMK / KRK / TKM / KIG / INM / HCD / HNB / KPT
```

### 10. `FGI*.DAT`

作用：OE 索引表。输入 OE 先查它。

记录长度：`22` 字节。

建议表：`oe_index`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:10` | `oe_no` | OE，去掉横杠，例如 `485108Z205` |
| `10:12` | `blank` | 空白 |
| `12:18` | `reference_code` | 参考号，例如 `48510` |
| `18:22` | `figure_group` | 图组，例如 `4803` |

示例：

```text
485108Z205  48510 4803
```

主关联：

```text
FGI.reference_code -> HINMEI.reference_code
FGI.figure_group   -> BZI.figure_group
```

状态：已确认，可直接入库。

### 11. `BZI*.DAT`

作用：图组到图片号。

记录长度：`37` 字节。

建议表：`figure_images`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:4` | `figure_group` | 图组 |
| `4:8` | `sequence` | 图片顺序 |
| `8:15` | `image_code` | 图片号，例如 `484156B` |
| `15:21` | `start_ym` | 开始年月 |
| `21:27` | `end_ym` | 结束年月，`999999` 表示未结束 |
| `27:30` | `count_code` | 数量/页码类代码 |
| `30:34` | `option_code` | 条件代码 |
| `34:37` | `note_index` | 3 字节小端整数/注释索引 |

示例：

```text
48030001484156B2015059999990025XDX...
```

状态：已确认，可直接入库。

### 12. `EMI*.DAT`

作用：图片号索引。

记录长度：`12` 字节。

建议表：`image_index`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:1` | `image_type` | 图片类型/内部标记 |
| `1:5` | `figure_group` | 图组 |
| `5:12` | `image_code` | 图片号 |

示例：

```text
24803484156B
```

可解析为：

```text
image_type = 2
figure_group = 4803
image_code = 484156B
```

状态：已确认，可直接入库。

### 13. `EMK*.DAT`

作用：PNG 图片包。

结构：不是固定行表，而是多个 PNG 图片连续存放。

建议表：`image_blobs`

| 字段 | 说明 |
|---|---|
| `region` | 地区 |
| `catalog` | 目录 |
| `image_code` | 图片号 |
| `offset` | 在 `EMK*.DAT` 中的位置 |
| `length` | 图片长度 |
| `output_path` | 提取后的图片路径 |

需要配合：

```text
EMK*.IA0
```

状态：已确认，可提取图片。

### 14. `EMK*.IA0`

作用：图片包索引。

记录长度：`15` 字节。

建议表：`image_blob_index`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:7` | `image_code` | 图片号 |
| `7:11` | `offset` | 小端整数，通常 1-based |
| `11:15` | `length` | 小端整数，图片长度 |

读取图片：

```text
start = offset - 1
end = start + length
```

状态：已确认，可直接入库。

### 15. `KRK*.DAT`

作用：车型目录包含哪些基础底盘/车架范围。

记录长度：`68` 字节。

建议表：`catalog_frames`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:8` | `row_no` | 内部序号 |
| `8:24` | `start_frame_raw` | 起始底盘/流水号原文 |
| `24:40` | `end_frame_raw` | 结束底盘/流水号原文 |
| `40:68` | `plant_raw` | 工厂/产地 |

示例：

```text
00000030GGN125 -0001001     GGN125 -0009999     PLANT.THAILAND
```

建议额外抽取：

| 字段 | 来源 |
|---|---|
| `frame_code` | 从 `start_frame_raw` 抽取，例如 `GGN125` |
| `start_serial` | 从 `start_frame_raw` 抽取 |
| `end_serial` | 从 `end_frame_raw` 抽取 |
| `plant` | 从 `plant_raw` 清洗 |

状态：已确认，可直接入库。

### 16. `TKM*.D01/D02/D03/D04/D05`

作用：条件类别字典。

记录长度：`22` 字节。

建议表：`condition_groups`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:2` | `condition_group` | 条件类别代码 |
| `2:22` | `condition_name` | 条件类别名称 |

示例：

```text
07DRIVER'S POSITION
```

说明：

```text
07 = 左舵/右舵类别
```

状态：已确认，可直接入库。

### 17. `KIG*.D01/D02/D03/D04/D05`

作用：条件值字典。

记录长度：`82` 字节。

建议表：`condition_values`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:2` | `condition_group` | 条件类别代码 |
| `2:10` | `condition_value` | 条件值代码 |
| `10:82` | `description` | 条件说明 |

示例：

```text
07LHD       LEFT-HAND DRIVE VEHICLES
07RHD       RIGHT-HAND DRIVE VEHICLES
```

状态：已确认，可直接入库。

### 18. `INM*.DAT`

作用：图组说明、插图说明、部分条件说明。

记录长度：`104` 字节。

建议表：`illustration_notes`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:104` | `raw_text` | 原始说明 |

建议额外抽取：

| 字段 | 说明 |
|---|---|
| `title` | 从文本中抽取，例如 `ENGINE ROOM` |
| `date_range` | 从括号中抽取，例如 `(1505-)` |
| `condition_text` | 车型/条件说明 |

状态：结构确认，字段含义部分确认。第一阶段建议原样入库。

### 19. `HCD*.DAT`

作用：图组和参考号/零件位置的辅助关系表。

记录长度：`10` 字节。

建议表：`figure_reference_links`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:4` | `figure_group` | 图组 |
| `4:9` | `reference_code` | 参考号 |
| `9:10` | `suffix` | 后缀/保留 |

示例：

```text
110304111
```

可解析为：

```text
figure_group = 1103
reference_code = 04111
```

状态：基本确认，可入库，但业务用途还要继续验证。

### 20. `HNB*.ACD`

作用：附加说明/注释/名称类压缩数据包。

结构：`.ACD` 未完全解码。

建议表：`raw_catalog_acd`

| 字段 | 说明 |
|---|---|
| `region` | 地区 |
| `catalog` | 目录 |
| `file_name` | 文件名 |
| `file_size` | 大小 |
| `raw_blob` | 可选 |

配套索引：

```text
HNB*.IA1
HNB*.IA2
```

状态：未解码。第一阶段不作为核心表。

### 21. `KPT*.DAT`

作用：精确适配规则索引，是最关键文件。

记录长度：`9` 字节。

建议表：`kpt_edges`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:6` | `condition_fragment` | 条件片段 |
| `6:9` | `rule_id` | 内部规则编号 |

示例：

```text
104851001
0008Z2050
001LHD054
000RHD050
```

理解方式：

```text
条件片段 -> 内部规则编号
```

查询方式：

```text
输入 OE 48510-8Z205
拆成多个片段，例如 48510 / 8Z205 / 4803 / LHD / RHD
在 kpt_edges 中找这些片段对应的 rule_id
多个条件取交集
交集 rule_id 再翻译成完整车型条件
```

状态：结构已确认，可入库。业务翻译还要继续做。

### 22. `*.IA0 / *.IA1 / *.IA2`

作用：原 EPC 程序索引。

通用结构：

```text
key + start_record + record_count
```

其中：

```text
start_record = 4 字节小端整数
record_count = 4 字节小端整数
```

常见索引结构：

| 文件 | 记录长度 | key 长度 | 说明 |
|---|---:|---:|---|
| `FGI*.IA1` | 20 | 12 | OE/参考索引 |
| `BZI*.IA1` | 12 | 4 | 图组索引 |
| `HCD*.IA1` | 14 | 6 | 辅助关系索引 |
| `HNB*.IA1/IA2` | 14 | 6 | HNB 索引 |
| `KPT*.IA1/IA2` | 11 | 3 | KPT 索引 |
| `EMK*.IA0` | 15 | 7 | 图片包索引，特殊，必须用 |
| `HINMEI*.IA2` | 14 | 6 | 零件名索引 |
| `FRAMNO.IA1` | 15 | 7 | 车架范围索引 |
| `CHOHIN/DAIHIN.IA*` | 20 | 12 | 零件关系索引 |
| `HINCLR.IA*` | 20 | 12 | 颜色索引 |
| `RYAKUG*.IA1` | 28 | 20 | 缩写索引 |

数据库转换建议：

```text
除了 EMK*.IA0 必须用于提图，其它 IA 文件可以先不导入。
把 DAT 导入数据库后，自己建立数据库索引更简单。
```

## 三、FL 目录

路径：

```text
D:\TMCEPCW3\epcdata\FL\DM\{车型}
D:\TMCEPCW3\epcdata\FL\OV\{车型}
```

示例：

```text
D:\TMCEPCW3\epcdata\FL\DM\GUN125
D:\TMCEPCW3\epcdata\FL\OV\GUN125
```

文件：

```text
0001.ACD
0001.IA1
0002.ACD
0002.IA1
...
```

### 23. `FL\DM/OV\*.ACD`

作用：车型级数据包。

当前确认：

| 项目 | 结果 |
|---|---|
| 记录长度 | 多数为 `42` 字节 |
| 内容 | 高位编码/压缩，不是明文 |
| 是否可直接解释 | 暂不可以 |

建议表：`fl_acd_records`

| 字段 | 说明 |
|---|---|
| `fl_type` | `DM` 或 `OV` |
| `model_code` | 车型目录，例如 `GUN125` |
| `file_no` | 文件名，例如 `0001` |
| `record_no` | 42 字节记录序号 |
| `raw_42_bytes` | 原始 42 字节 |

状态：结构部分确认，内容未解码。

### 24. `FL\DM/OV\*.IA1`

作用：FL ACD 的索引。

记录长度：通常 `12` 字节。

建议表：`fl_acd_index`

| 字节位置 | 字段 | 说明 |
|---|---|---|
| `0:4` | `file_no` | 文件编号 |
| `4:8` | `start` | 小端整数 |
| `8:12` | `count` | 小端整数 |

状态：结构确认，业务含义待验证。

## 四、JPIO 目录

路径：

```text
D:\TMCEPCW3\epcdata\JPIO\M1
```

文件：

```text
*.csv
*.jpg
*.xls
CDINFO.INI
Thumbs.db
```

### 25. `JPIO\M1\*.csv`

作用：日本/海外用品、附件、JPIO 明文资料。

格式：CSV，逗号分隔，带引号。

建议表：`jpio_parts`

| CSV 顺序 | 字段 | 示例 |
|---:|---|---|
| 1 | `category_code` | `019J` |
| 2 | `line_no` | `1` |
| 3 | `bulletin_no` | `24R06-002` |
| 4 | `title` | `JPIO for LEXUS NX 25YM/MIDDLE EAST` |
| 5 | `issue_ym` | `202405` |
| 6 | `unknown_1` | 空 |
| 7 | `part_name` | `GARNISH, RR BUMPER STEP` |
| 8 | `part_no` | `PZ325-78010` |
| 9 | `destination` | `GCC,JORDAN,LEBANON...` |
| 10 | `image_group` | `1` |
| 11 | `condition_text` | `LHD,BLACK,TEXTILE` |
| 12 | `model_codes` | `TAZA25L-AWZLTV,...` |
| 13 | `image_file` | `019J_24R06-002_01.jpg` |

状态：明文，可直接入库。

### 26. `JPIO\M1\*.jpg`

作用：JPIO CSV 对应图片。

建议表：`jpio_images`

| 字段 | 说明 |
|---|---|
| `image_file` | 图片文件名 |
| `path` | 图片路径 |
| `bulletin_no` | 从文件名抽取 |
| `image_no` | `_01/_02` 等 |

状态：可直接入库或保存路径。

### 27. `JPIO\M1\*.xls / CDINFO.INI / Thumbs.db`

建议：

```text
先只保存文件清单。
不作为主数据。
```

## 五、推荐数据库表清单

第一阶段必须建：

```text
catalogs
oe_index
part_names
figure_group_names
figure_images
image_index
image_blob_index
catalog_frames
condition_groups
condition_values
kpt_edges
vin_prefixes
vin_ranges
jpio_parts
jpio_images
```

第二阶段再建：

```text
fitment_rules
part_relation_chohin
part_relation_daihin
color_names
abbreviations
illustration_notes
figure_reference_links
fl_acd_records
raw_acd_files
```

## 六、最重要的关联关系

```mermaid
flowchart TD
  OE["oe_index<br/>OE / reference / figure_group"]
  NAME["part_names<br/>reference -> 中文名"]
  FIG["figure_images<br/>figure_group -> image_code"]
  IMG["image_blob_index<br/>image_code -> PNG位置"]
  FRAME["catalog_frames<br/>目录 -> 基础底盘"]
  COND["condition_values<br/>LHD/RHD等字典"]
  KPT["kpt_edges<br/>条件片段 -> rule_id"]
  VIN["vin_ranges<br/>底盘/年份/流水范围"]

  OE --> NAME
  OE --> FIG --> IMG
  OE --> FRAME
  OE --> KPT
  COND --> KPT
  VIN --> FRAME
```

## 七、转库顺序

建议按这个顺序做：

```text
1. 导入地区和目录清单
2. 导入 HINMEI 零件名称
3. 导入 FGI OE 索引
4. 导入 BZI / EMI / EMK.IA0 图片索引
5. 提取 EMK 图片
6. 导入 KRK 车型底盘范围
7. 导入 TKM / KIG 条件字典
8. 导入 FRAMNO / VIN9
9. 导入 KPT 9 字节规则边
10. 用 KPT 生成 fitment_rules
11. 导入 JPIO CSV/JPG
12. 以后再处理 FL/ACD
```

## 八、当前不能直接解释的文件

这些文件建议先保存原始文件信息，不要阻塞第一版数据库：

```text
SHAMEI.ACD
JOHO*.ACD
HNB*.ACD
FL\DM\*.ACD
FL\OV\*.ACD
OVCFH*.ACD
```

原因：

```text
这些不是明文固定字段，仍需要单独解码。
但 OE、名称、图片、基础底盘、条件字典、KPT 规则边已经足够开始建立你的数据库。
```

