推荐阅读
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
在程序开发中,经常会遇到要从外部文件中读取数据的情况,文件类型也比较多。
于是,小魔龙就将常见的文件类型:Txt、Json、Xml、Excel、Csv,读取、修改、保存等常见操作代码总结下来。
一方面可以自己复习,另一方面也希望可以帮助更多的人吧。
这是本系列文章第五篇:
【Unity3D读取数据】(一)Txt文档操作(创建、读取、写入、修改)
【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)
【Unity3D读取数据】(三)Xml文件操作(创建、读取、写入、修改)
【Unity3D读取数据】(四)Excel文件操作(创建、读取、写入、修改)
【Unity3D读取数据】(五)Csv文件操作(创建、读取、写入、修改)
二、唠叨两句
Csv文件,又称逗号分隔值文件,文件以纯文本的形式存储表格数据,所以csv也是一种特殊的表格。
纯文本就意味着该文件必须像二进制文件那样解析,使用记事本打开,可以看到数据都是以逗号分隔。
csv文件由任意条数据组成,记录间以换行符分隔,每条数据字段间以逗号分隔。
csv文件跟Excel文件虽然都是表格文件,但是格式还有有很大不同的,Excel文件用文本编辑器打开是一堆乱码,csv文件用文本编辑器打开就是以逗号分隔的数据。
csv文件的出现就是为了实现简单的数据存储,是一种纯文本的文件,最广泛的应用是在程序之间转移表格数据,能够兼容各种程序,那么面对这样的文件类型该如何创建、读取、写入、修改呢。
以下就是csv文件的详细教程:
三、创建csv文件
Csv文件是纯文本文档,只需要按照特定的格式保存文档,然后添加后缀.csv即可。
特定的格式:以换行分隔符分割每一行,以逗号分割每一列。
3-1、构建DataTable数据,创建csv文档(第一种写法)
下面的例子演示了如何创建csv文档:
using Excel;
using OfficeOpenXml;
using System;
using System.Data;
using System.IO;
using System.Text;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
void Start()
{
}
// 将DataTable中数据写入到CSV文件中
public static void SaveCSV(string filePath,DataTable dt)
{
FileInfo fi = new FileInfo(filePath);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
{
string data = "";
//写入表头
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
//写入每一行每一列的数据
for (int i = 0; i < dt.Rows.Count; i++)
{
data = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
string str = dt.Rows[i][j].ToString();
data += str;
if (j < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
}
}
}
}
因为这个函数需要传递进去一个数据表DataTable数据,所以,我们要先构建一个DataTable数据,在这里就演示一下如何创建DataTable数据:
构建DataTable
using Excel;
using OfficeOpenXml;
using System;
using System.Data;
using System.IO;
using System.Text;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
void Start()
{
//创建表 设置表名
DataTable dt = new DataTable("Sheet1");
//创建列 有三列
dt.Columns.Add("名字");
dt.Columns.Add("年龄");
dt.Columns.Add("性别");
//创建行 每一行有三列数据
DataRow dr = dt.NewRow();
dr["column0"] = "张三";
dr["column1"] = "18";
dr["column2"] = "男";
dt.Rows.Add(dr);
//取值 第一行的123列的数据
Debug.Log(dt.Rows[0][0].ToString());
Debug.Log(dt.Rows[0][1].ToString());
Debug.Log(dt.Rows[0][2].ToString());
}
}
运行结果:
OK,有了数据表数据,就可以去创建csv文件了:
using Excel;
using OfficeOpenXml;
using System;
using System.Data;
using System.IO;
using System.Text;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
void Start()
{
//创建表 设置表名
DataTable dt = new DataTable("Sheet1");
//创建列 有三列
dt.Columns.Add("名字");
dt.Columns.Add("年龄");
dt.Columns.Add("性别");
//创建行 每一行有三列数据
DataRow dr = dt.NewRow();
dr["名字"] = "张三";
dr["年龄"] = "18";
dr["性别"] = "男";
dt.Rows.Add(dr);
string filePath = Application.streamingAssetsPath + "\\data.csv";
SaveCSV(filePath, dt);
}
// 将DataTable中数据写入到CSV文件中
public static void SaveCSV(string filePath,DataTable dt)
{
FileInfo fi = new FileInfo(filePath);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
{
string data = "";
//写入表头
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
//写入每一行每一列的数据
for (int i = 0; i < dt.Rows.Count; i++)
{
data = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
string str = dt.Rows[i][j].ToString();
data += str;
if (j < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
}
}
}
}
运行结果:
3-2、构建DataTable数据,创建csv文档(第二种写法)
两种写法很像,个人觉得第二种写法更简单一些:
using Excel;
using OfficeOpenXml;
using System;
using System.Data;
using System.IO;
using System.Text;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
void Start()
{
//创建表 设置表名
DataTable dt = new DataTable("Sheet1");
//创建列 有三列
dt.Columns.Add("名字");
dt.Columns.Add("年龄");
dt.Columns.Add("性别");
//创建行 每一行有三列数据
DataRow dr = dt.NewRow();
dr["名字"] = "张三";
dr["年龄"] = "18";
dr["性别"] = "男";
dt.Rows.Add(dr);
string filePath = Application.streamingAssetsPath + "\\data.csv";
SaveCSV(filePath, dt);
}
public void SaveCSV(string CSVPath, DataTable mSheet)
{
//判断数据表内是否存在数据
if (mSheet.Rows.Count < 1)
return;
//读取数据表行数和列数
int rowCount = mSheet.Rows.Count;
int colCount = mSheet.Columns.Count;
//创建一个StringBuilder存储数据
StringBuilder stringBuilder = new StringBuilder();
//读取数据
for (int i = 0; i < mSheet.Columns.Count; i++)
{
stringBuilder.Append(mSheet.Columns[i].ColumnName + ",");
}
stringBuilder.Append("\r\n");
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < colCount; j++)
{
//使用","分割每一个数值
stringBuilder.Append(mSheet.Rows[i][j] + ",");
}
//使用换行符分割每一行
stringBuilder.Append("\r\n");
}
//写入文件
using (FileStream fileStream = new FileStream(CSVPath, FileMode.Create, FileAccess.Write))
{
using (TextWriter textWriter = new StreamWriter(fileStream,Encoding.UTF8))
{
textWriter.Write(stringBuilder.ToString());
}
}
}
}
运行结果:
四、读取csv文件
读取csv文件就没啥好说的,就是将读取的数据保存到DataTable数据表中,然后读取数据表里面的数据即可:
using Excel;
using OfficeOpenXml;
using System;
using System.Data;
using System.IO;
using System.Text;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
void Start()
{
string filePath = Application.streamingAssetsPath + "\\data.csv";
DataTable dt = OpenCSV(filePath);
Debug.Log(dt.Rows[0][0]);
Debug.Log(dt.Rows[0][1]);
Debug.Log(dt.Rows[0][2]);
}
public static DataTable OpenCSV(string filePath)//从csv读取数据返回table
{
DataTable dt = new DataTable();
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
{
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine = null;
string[] tableHead = null;
//标示列数
int columnCount = 0;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{
if (IsFirst == true)
{
tableHead = strLine.Split(',');
IsFirst = false;
columnCount = tableHead.Length;
//创建列
for (int i = 0; i < columnCount; i++)
{
DataColumn dc = new DataColumn(tableHead[i]);
dt.Columns.Add(dc);
}
}
else
{
aryLine = strLine.Split(',');
DataRow dr = dt.NewRow();
for (int j = 0; j < columnCount; j++)
{
dr[j] = aryLine[j];
}
dt.Rows.Add(dr);
}
}
if (aryLine != null && aryLine.Length > 0)
{
dt.DefaultView.Sort = tableHead[0] + " " + "asc";
}
sr.Close();
fs.Close();
return dt;
}
}
}
}
结果:
五、后言
要记得csv文件就是一个纯文本的文件,所以可以使用纯文本的形式去读取文件,保存文件。
之所以用DataTable数据表,就是因为这个数据结构读取、保存、使用数据都非常的方便。
当然也可以使用数组或者自定义类去解析csv文件,只要是按照换行符进行分割,然后按照逗号进行分割列即可。