众所周知,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)

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: