0%

Unity读取和写入CSV文件


Unity 中经常需要存储数据,比如实现存档功能。这时候便需要把数据保存在文件中,以便数据持久化。
保存数据的文件类型有很多种,其中便包含 CSV 文件类型。


CSV文件类型

CSV,全称为 Comma-Separated Values,中文译名为逗号分隔值。顾名思义,该类文件保存数据的方式便是以逗号分隔。
CSV 文件可以使用 Excel 编辑,但其本质仍是文本文档。
一个常见的 CSV 文件如下图所示:

image.png

其在文本中为:

image.png

CSV 中分隔符类型可以自义定。

因为其有分隔符的特性,可以很方便的处理简单数据。

读取和写入

Unity 使用 C# 作为脚本语言。而 C# 提供了很多操作文件的类和方法,极大的简化了编写流程。
所用操作文件的方法,都在System.IO命名空间内。
下面的代码,是我自制游戏 FlappyBird 内所用的。

读取

C# 中有专门读取文件的类StreamReader
这里要读取文件内的分数,可以写出如下代码:

1
2
3
4
5
6
7
8
9
private StreamReader Read(string path)
{
if (path == null)
return null;
path += fileName;
if (!File.Exists(path))
File.CreateText(path);
return new StreamReader(path);
}

然后用一个public方法调用之。

1
2
3
4
5
6
7
8
9
10
11
12
13
public List<string[]> ReadCsv(string path)
{
List<string[]> list = new List<string[]>();
string line;
StreamReader stream = Read(path);
while ((line = stream.ReadLine()) != null)
{
list.Add(line.Split(','));
}
stream.Close();
stream.Dispose();
return list;
}

分隔的字符串,每一行都是一个string[],用一个List<string[]>保存所有内容。

这里的fileName是指 CSV 文件的地址,如\save.csv

随后便可以根据具体需求,对数据进行处理。

写入

与上文的StreamReader对应,读取文件用的是StreamWriter
其打开文件的方法和上文读取文件的方法类似,故略去。
在我的项目内,我需要对游戏内实时产生的分数写入文件,以形成一个所谓分数排行榜。
所以代码如下:

1
2
3
4
5
6
7
8
9
10
11
public void WriteCsv(string[] strs, string path)
{
StreamWriter stream = Write(path);
for (int i = 0; i < 10; i++)
{
if (strs[i] != null)
stream.WriteLine($"{(i + 1).ToString()},{strs[i]}");
}
stream.Close();
stream.Dispose();
}

注意

对文件的操作有一些注意事项,下面都是我血和泪的教训。

  1. 不能写入已经打开的文件。
  2. 在操作文件之前,要检查文件是否存在。
  3. 操作文件有一定性能问题,注意不要放在Update内。
  4. 对于 Unity 来讲,文件所在文件夹内必须已经有文件,否则 Unity 打包时不会生成该文件夹。

-------------End-------------