【GDScript】加载 csv 文件,转化为字典

Godot 3.3 rc6

Excel 中存储数据无法直接保存成 json 格式的文件,如果想要保存的话需要安装插件,而且比较麻烦。但是可以直接保存成 csv 文件。

我用 WPS 表格作为演示,里边写入如下两行数据:
【GDScript】加载 csv 文件,转化为字典_第1张图片

Name Health Attack Level Description
名称 健康 攻击力 等级 描述
乞丐 2 1 2 长期饥饿,导致骨瘦如柴,攻击无力
恶棍 3 2 2

保存为 csv 文件,我命名为 UnitData.csv
【GDScript】加载 csv 文件,转化为字典_第2张图片

解析 csv 文件

创建一个 FileManager.gd 文件,写入如下代码

extends Node

## 返回 Unit 的 csv 文件数据
func get_unit_data() -> Dictionary:
	var data_list = parse_csv_file("res://UnitData.csv", "Name")
	return data_list


## 解析 csv 文件
## @path 文件路径
## @key 以数据中的哪个值作为 key 值记录到字典中
## @return 以第一行数据作为 key 值,记录成字典形式
func parse_csv_file(path: String, key: String) -> Dictionary:
	var file = File.new()
	file.open(path, File.READ)

	# 没有数据则返回空字典
    # 以 ; 分号进行分隔,具体需要自己打开 csv 文件查看是那种字符进行分隔的
	var temp = file.get_csv_line(";")
	if temp.size() <= 1:
		return {}

	# 第一行做为 key
	var keys = []
	for i in temp:
		keys.push_back(i)

	# 读取一行,但不对数据进行操作(这样等于是跳过了这一行)
    # 如果第二行就是要读取的数据,那么就不必加这一行代码
	file.get_csv_line()

	# 获取数据记录到字典中,字典可以方便的获取每个数据
	# 比如我们以数据的名字那一列作为 key 值
    # 那么我们只用通过 名字 来获取那一行数据
	var data_list = {}
	var err_count = 0	# 数据错误次数
	temp = file.get_csv_line(";")
	while temp.size() > 1:
		# 数据列数和 key 数量不一致,则跳过
		if temp.size() != keys.size():
			err_count += 1
			if err_count > 10:	# 错误超过 10 次,则不再读取
				break
			temp = file.get_csv_line(";")
			print_debug("数据有误,与第一行不一致 n: %d, k: %d" % [temp.size(), keys.size()])
			continue

		# 每行数据保存到字典中
		var data = {}
		for idx in range(temp.size()):
			data[keys[idx]] = temp[idx]
		data_list[data[key]] = data

		# 读取下一行数据
		temp = file.get_csv_line(";")

	file.close()
	return data_list

添加到 自动加载
【GDScript】加载 csv 文件,转化为字典_第3张图片
【GDScript】加载 csv 文件,转化为字典_第4张图片
【GDScript】加载 csv 文件,转化为字典_第5张图片
【GDScript】加载 csv 文件,转化为字典_第6张图片

测试

创建一个新场景 Test01,添加一个脚本
在这里插入图片描述
代码如下:

extends Node2D

func _ready():
	var unit_data = FileManager.get_unit_data()
	
	# 输出所有数据
	print(JSON.print(unit_data, "\t"))
	
	# 输出 `乞丐` 角色的数据
	print(unit_data['乞丐'])

输出内容如下:
【GDScript】加载 csv 文件,转化为字典_第7张图片

你可能感兴趣的:(Godot,Godot,csv,gdscript,数据)