众所周知,CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
所以在制作游戏时,可能会用到CSV来记录各个物品的数据,就像这样:
ID;Name;Description;ItemType 01;《无机化学》第四版;风靡于各大高校的法器,可造成巨额化学伤害;Catalyst 02;菜刀;厨房里的常见厨具,但是用途特别多;Tool 03;理想电源;一个没有内阻的理想电源,虽然电压只有1.5V,但是电流强劲!;Catalyst 04;等轴双曲线;一个平平无奇的等轴双曲线,却可以用其开口困住敌人;Shield
我们要将这些数据解析成表格(DataTable),以便更好去呈现或者调用:
IDNameDescriptionItemType01《无机化学》第四版风靡于各大高校的法器,可造成巨额化学伤害Catalyst02菜刀厨房里的常见厨具,但是用途特别多Tool03理想电源一个没有内阻的理想电源,虽然电压只有1.5V,但是电流强劲!Catalyst04等轴双曲线一个平平无奇的等轴双曲线,却可以用其开口困住敌人Shield
想要解析CSV文件,就必须知道CSV的特征:
纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;由记录组成(典型的是每行一条记录);每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);每条记录都有同样的字段序列。
(其中第三点可以给我们解析CSV文件提供思路)
我们不难思考出读取并解析CSV的程序该怎么写
将CSV读取成字符串利用换行符'\n'将读取的字符串每一行分割遍历分割出的每一个字符串(源文件对应每一行),再次利用分隔符进行分割(分隔符一般有分号(';')、逗号(',') 、空格(' '),这次示例中使用的分隔符为分号将分割出来的每一项字符串存入DataTable表格
然后只需将表格控件的DataSource设置为DataTable就可以啦
理论存在,实践开始
首先拉个窗口,控件很简单,只需加个DataGridView和Button即可
功能为点击按钮则解析对应CSV并呈现在DataGridView上
然后再按钮点击事件中写一个文件位置字符串(我的示例表格再桌面上)
string filePath = @"D:\系统文件\桌面\Table.txt";
接着获取csv数据
Encoding encoding = Encoding.GetEncoding("UTF-8");//编码
string csv = File.ReadAllText(filePath, encoding);
然后我们写一个加载CSV的方法供按钮事件调用(写在按钮事件里面也可啦)
public DataTable LoadCSV(string data)
{
DataTable resultTable = new DataTable();//创建空DataTable
//在下面写解析代码
return resultTable;
}
下面我们完善这个读取方法
按照思路,先把每一行分离,并且创建一个文件头
data = data.Replace("\r", string.Empty);//清除一些必须清理的东西
string[] lines = data.Split(new char[1] { '\n' }, StringSplitOptions.RemoveEmptyEntries);//分离每一行,StringSplitOptions.RemoveEmptyEntries:返回值不包含空字符串
string[] dataHead = null;//文件头
然后再加上对每一行解析的代码
foreach (string line in lines)//对每一行数据进行操作
{
if (string.IsNullOrEmpty(line)) continue;
string[] items = line.Split(';');//以分号分离每一行数据
//这一块用于读取文件头
if (line == lines[0])//如果在读取文件头
{
dataHead = new string[items.Length];
dataHead = items;//将文件头数据赋值给dataHead
foreach (string item in items)
{
resultTable.Columns.Add(new DataColumn { ColumnName = item });//把文件头中的元素加入dataTable的列中
}
}
else//这一块用于读取数据并将数据写入表格
{
DataRow row = resultTable.NewRow();//添加行进入dataTable
for (int i = 0; i < items.Length; i++)//向行中添加数据(除类名)
{
row[dataHead[i]] = items[i];//dataHead[i]为文件头元素,item[i]为文件头元素对应值
}
resultTable.Rows.Add(row);//添加行进入dataTable
}
}
(这些看似有一大段,原理实际上非常好弄懂)
最后再按钮方法中加上这一行,给表格数据源赋上读取CSV方法得到的数据
dataGridView1.DataSource = LoadCSV(csv);
大功告成!
运行看看...
效果非常好!CSV数据呈现在表格里啦!
最后附上全部代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string filePath = @"D:\系统文件\桌面\Table.txt";
Encoding encoding = Encoding.GetEncoding("UTF-8");//编码
string csv = File.ReadAllText(filePath, encoding);
dataGridView1.DataSource = LoadCSV(csv);
}
public DataTable LoadCSV(string data)
{
DataTable resultTable = new DataTable();//创建空DataTable
//在下面写解析代码
data = data.Replace("\r", string.Empty);//清除一些必须清理的东西
string[] lines = data.Split(new char[1] { '\n' }, StringSplitOptions.RemoveEmptyEntries);//分离每一行,StringSplitOptions.RemoveEmptyEntries:返回值不包含空字符串
string[] dataHead = null;//文件头
foreach (string line in lines)//对每一行数据进行操作
{
if (string.IsNullOrEmpty(line)) continue;
string[] items = line.Split(';');//以分号分离每一行数据
//这一块用于读取文件头
if (line == lines[0])//如果在读取文件头
{
dataHead = new string[items.Length];
dataHead = items;//将文件头数据赋值给dataHead
foreach (string item in items)
{
resultTable.Columns.Add(new DataColumn { ColumnName = item });//把文件头中的元素加入dataTable的列中
}
}
else//这一块用于读取数据并将数据写入表格
{
DataRow row = resultTable.NewRow();//添加行进入dataTable
for (int i = 0; i < items.Length; i++)//向行中添加数据(除类名)
{
row[dataHead[i]] = items[i];//dataHead[i]为文件头元素,item[i]为文件头元素对应值
}
resultTable.Rows.Add(row);//添加行进入dataTable
}
}
return resultTable;
}
}
(文件路径可以修改的哦~)
(作者还是高中生,自学编程,文章写的烂请不要见怪doge)
参考链接
发表评论