Winform 编写一个读取并解析csv的程序

众所周知,CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。

所以在制作游戏时,可能会用到CSV来记录各个物品的数据,就像这样:

ID;Name;Description;ItemType
01;《无机化学》第四版;风靡于各大高校的法器,可造成巨额化学伤害;Catalyst
02;菜刀;厨房里的常见厨具,但是用途特别多;Tool
03;理想电源;一个没有内阻的理想电源,虽然电压只有1.5V,但是电流强劲!;Catalyst
04;等轴双曲线;一个平平无奇的等轴双曲线,却可以用其开口困住敌人;Shield

我们要将这些数据解析成表格(DataTable),以便更好去呈现或者调用:

IDNameDescriptionItemType
01《无机化学》第四版风靡于各大高校的法器,可造成巨额化学伤害Catalyst
02菜刀厨房里的常见厨具,但是用途特别多Tool
03理想电源一个没有内阻的理想电源,虽然电压只有1.5V,但是电流强劲!Catalyst
04等轴双曲线一个平平无奇的等轴双曲线,却可以用其开口困住敌人Shield

想要解析CSV文件,就必须知道CSV的特征:

  1. 纯文本,使用某个字符集,比如ASCIIUnicodeEBCDICGB2312
  2. 由记录组成(典型的是每行一条记录);
  3. 每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
  4. 每条记录都有同样的字段序列。

(其中第三点可以给我们解析CSV文件提供思路)

我们不难思考出读取并解析CSV的程序该怎么写

  1. 将CSV读取成字符串
  2. 利用换行符'\n'将读取的字符串每一行分割
  3. 遍历分割出的每一个字符串(源文件对应每一行),再次利用分隔符进行分割(分隔符一般有分号(';')、逗号(',') 、空格(' '),这次示例中使用的分隔符为分号
  4. 将分割出来的每一项字符串存入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)

  • 32
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值