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

2023-11-15

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

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

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

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

ID Name Description ItemType
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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Winform 编写一个读取并解析csv的程序 的相关文章

  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • Azure CloudTable 线程安全吗?

    我正在使用 Storage SDK 2 0 从不同线程 ASP NET 应用程序 写入 Azure 表存储 Is 云表 object 线程安全 我是否可以仅初始化 CloudStorageAccount CloudTableClient 和
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 如何获取Windows批处理的父文件夹

    我正在编写一个批处理文件 我需要获取该bat文件的父文件夹 有可能吗 注意 我的意思是批处理文件的父文件夹 而不是调用该批处理的提示的当前目录 Thanks 批处理的父文件夹位于变量中 dp0位于 例子 echo off setlocal
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 秒传的原理

    在本文中 我们将介绍网盘秒传的基本原理和实现方法 以及秒传的优缺点和应用场景 网盘秒传的基本原理 网盘秒传的基本原理是利用哈希算法 如MD5或SHA 1 对文件进行特征值提取 然后与服务器上已有的文件特征值进行比对 如果发现相同的特征值 就
  • C语言实现贪吃蛇小游戏

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 贪吃蛇实现的结构和方式 2 对窗口进行设置 3 对蛇进行初始化 一 源代码 利用学会的知识做点小游戏 前言 控制台的欢乐就是这么简单 提示 以下是本篇文章
  • Vue3 Table 性能优化,减少 85% 渲染耗时

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 原文链接 https juejin cn post 7194516447932973112 作者 dev zuo 前段时间公司有一个比较
  • 一个新的开始(非技术贴)

    谈谈一个新的开始 说实话 从来没想过自己会有一刻坐在这里写博客 因为一直以来都觉得自己会像父母所期望的那样考上公务员 结婚生子 过平凡的一生 从大一以来 自己都一直坚信这样对我来说是最最好的 但今年大三 用了短短一个月我就改变了想法 可以说
  • 38.驱动调试——printk

    printk的用法 mz linux ChinaUnix博客 printk函数的用法 wwwlyj123321的博客 CSDN博客 printk 34 Linux printk分析 使用 FILE FUNCTION LINE 调试 诺谦 博
  • freemarker---数字小数点格式化问题

    保留小数的问题问题 http blog sina com cn s blog 7db125620101codn html http blog 163 com sir 876 blog static 117052232012102854524
  • SIM800C模块AT指令编程指南

    SIM800C是一款四频GSM GPRS模块 为城堡孔封装 其性能稳定 外观小巧 能满足客户的多种需求 SIM80C工作频率为GSM GPRS850 900 180 190OMHz 可以低功耗实现语音 SMS和数据信息的传输 SIM800C
  • Java 线程池的submit的使用与分析.md

    在Java5以后 通过Executor来启动线程比用Thread的start 更好 在新特征中 可以很容易控制线程的启动 执行和关闭过程 还能使用线程池的特性 上一篇我们介绍了线程池的基本用法和特性 我们用的最多的是ExecutorServ
  • Springboot的创建步骤

    1 创建Springboot模块 ider gt file gt new gt project gt Spring lnitializr gt 不选择default 默认 gt 选择custom定制网址 http start springb
  • Matlab实现无标度网络生成及其分析

    文章目录 引言 社会网络分类 Barab si Albert无标度网络生成算法 MATLAB代码实现 无向的无标度网络生成代码BAgraph undir 有向的无标度网络生成代码BAgraph dir 无标度网络的节点度统计分析 无向的无标
  • 机器学习常识 3: 分类、回归、聚类

    摘要 本贴描述分类 回归 聚类问题的基本概念 1 基本概念 机器学习常识 2 数据类型从输入数据的角度来进行讨论 这里从输出数据 或者目标的角度来讨论 分类是指将一个样本预测为给定类别之一 也称为该样本打标签 例 1 如果我去向那个女生表白
  • API接口原理实现及应用

    API Application Programming Interface 接口是现代软件开发中不可或缺的一部分 它们提供了一种机制 使得不同的应用程序和服务可以相互通信 共享数据和功能 在这篇文章中 我们将探讨API接口的原理 实现及应用
  • stable diffusion ——img2img Api参数数据格式参考,插件包含ControlNet和roop换脸

    init images resize mode 0 denoising strength 1 0 image cfg scale 1 5 mask mask blur 4 inpainting fill 2 inpaint full res
  • 【SQL】19 SQL函数

    SQL 拥有很多可用于计数和计算的内建函数 SQL Aggregate 函数 SQL Aggregate 函数计算从列中取得的值 返回一个单一的值 有用的 Aggregate 函数 AVG 返回平均值 COUNT 返回行数 FIRST 返回
  • DataX下载安装使用

    文章目录 01 Clickhouse到HBase Phoenix 数据导入 DataX 介绍 下载 执行同步的组件 配置数据同步 查看官方读写配置样例 创建Hbase和Phoenix表 创建ClickHouse表 写入ClickHouse测
  • 测试经验分享:做一个靠谱的软件测试人员

    何为靠谱 在带新人过程中 交待测试新人测试任务时 都不会忘记交待这样的一句话 这个开发如何如何 比如这个开发代码质量很好 少bug 修改bug也快 比如这个开发编码有点慢 跟任务时多催一下 比如这个开发编码质量不怎么样 bug多 你测试的时
  • 计算机网络系列--TCP 篇

    TCP 是因特网协议栈中运输层 传输层 常用的协议 该协议的全称为 Transmission Control Protocol 传输控制协议 它提供了一种可靠的数据传输 而因特网协议栈中运输层的另一种常用的协议则不提供可靠的数据传输 它在网
  • 消息中间件(一)

    文章目录 消息中间件 什么是中间件 为什么使用MQ 应用场景 JMS和AMQP JMS AMQP JMS和AMQP的区别 消息队列产品 消息中间件 什么是中间件 MQ全称为Message Queue 消息队列是应用程序和应用程序之间的通信方
  • pytorch mm.data.eq(1).nonzero()

    从这里看到 https www codenong com cs105935637 mm torch tensor 1 3 5 1 1 4 1 8 print mm n mm print mm data n mm data print mm
  • Winform 编写一个读取并解析csv的程序

    众所周知 CSV是一种通用的 相对简单的文件格式 被用户 商业和科学广泛应用 所以在制作游戏时 可能会用到CSV来记录各个物品的数据 就像这样 ID Name Description ItemType 01 无机化学 第四版 风靡于各大高校