C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

news2025/3/21 0:31:59

在这里插入图片描述

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

文章目录

  • C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)
    • 一、上位机开发中的CSV应用背景
    • 二、CSV读写实战教学
      • 1. 基本对象序列化
      • 2. 多数据类型处理
      • 3. 集合类型序列化
      • 4. 二进制数据处理
      • 5. 自定义类型支持
      • 6. 表头自定义
      • 7. 属性忽略
      • 8. 大文件完整读写测试
    • 三、安装部署指南
    • 四、感谢阅读

一、上位机开发中的CSV应用背景

在工业自动化上位机开发中,CSV格式数据的生成与解析是常见的核心需求:

  1. 用于设备运行数据的长期记录
  2. 实现与其他系统(如MES/ERP)的数据交换
  3. 生成可人工查阅的生产报表
  4. 调试阶段数据快照保存

传统方式通过硬编码拼接字符串效率低下,且难以处理复杂数据结构。本文将讲解如何使用CsvSerializer类轻松实现CSV文件的生成和读取。


二、CSV读写实战教学

1. 基本对象序列化

/// <summary>
/// 基本学生信息类
/// </summary>
public class SimpleStudent
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var students = new List<SimpleStudent>
{
    new SimpleStudent { Id = 1001, Name = "张三" },
    new SimpleStudent { Id = 1002, Name = "李四" }
};

var csv = new CsvSerializer().ConvertToCsvLines(students);
File.WriteAllLines("simple_students.csv", csv);

2. 多数据类型处理

/// <summary>
/// 复合数据类型演示类
/// </summary>
public class DataTypeDemo
{
    public DateTime RecordTime { get; set; }   // 时间类型
    public float Temperature { get; set; }     // 精确数值
    public bool IsValid { get; set; }          // 布尔类型
}

var data = new DataTypeDemo
{
    RecordTime = DateTime.Now,
    Temperature = 25.36f,
    IsValid = true
};

var serializer = new CsvSerializer();
File.WriteAllLines("data_types.csv", serializer.ConvertToCsvLines(new[] { data }));

3. 集合类型序列化

public class CollectionDemo
{
    public int[] SensorValues { get; set; }          // 整型数组
    public List<double> Voltages { get; set; }       // 泛型列表
}

var demo = new CollectionDemo
{
    SensorValues = new[] { 100, 200, 300 },
    Voltages = new List<double> { 3.3, 5.0, 12.0 }
};

// 生成CSV时集合元素自动以分号分隔
var csvLines = new CsvSerializer().ConvertToCsvLines(new[] { demo });

4. 二进制数据处理

public class BinaryData
{
    public byte[] ImageBuffer { get; set; }  // Base64编码存储
}

var data = new BinaryData
{
    ImageBuffer = File.ReadAllBytes("logo.png")
};

// 生成文件提示:大量二进制数据存入单行可能导致Excel无法打开
File.WriteAllLines("data_binary.csv", serializer.ConvertToCsvLines(new[] { data }));

5. 自定义类型支持

// 定义新的结构体类型
public struct Coordinate
{
    public double X;
    public double Y;
}

// 测试类型
public class CustomTypeDemo 
{ 
	public Coordinate Position { get; set; } 
}

// 注册自定义转换器
var serializer = new CsvSerializer();
serializer.Converters.Add(typeof(Coordinate), new StringConverter<Coordinate>(
    str =>
    {
        var parts = str.Split('|');
        return new Coordinate { X = double.Parse(parts[0]), Y = double.Parse(parts[1]) };
    },
    c => $"{c.X}|{c.Y}"
));

6. 表头自定义

public class MachineData
{
    [CsvColumn("Current Speed (m/min)")]
    public double Speed { get; set; }

    [CsvColumn("Working Temp (°C)")]
    public double Temperature { get; set; }
}

// 生成的CSV标题类似:
// Current Speed (m/min),Working Temp (°C)

7. 属性忽略

public class SecurityData
{
    public string PublicInfo { get; set; }

    [CsvIgnore]
    public string SecretKey { get; set; }  // 不会出现在CSV中
}

8. 大文件完整读写测试

在这里插入图片描述

生成用于测试的随机学生信息表CSV文件:

        /// <summary>
        /// 生成学生信息表
        /// </summary>
        public void GenerateTestCsvFile()
        {
            var serializer = new CsvSerializer();
            const int dataSize = 1000;

            var random = new Random();
            var students = Enumerable.Range(0, dataSize).Select(_ => GenerateRandomStudent(random)).ToList();

            var csv = serializer.ConvertToCsvLines(students);
            File.WriteAllLines("test_data.csv", csv);

            // 打开文件夹
            Process.Start("explorer.exe", "/select," + Path.GetFullPath("test_data.csv"));
            Console.WriteLine($"已生成测试数据文件:{Path.GetFullPath("test_data.csv")}");
        }

        /// <summary>
        /// 生成随机学生数据
        /// </summary>
        private static Student GenerateRandomStudent(Random random)
        {
            return new Student
            {
                // 基础类型
                Id = random.Next(10000, 99999),
                Name = $"Student_{random.Next(1, 1000)}",
                GPA = Math.Round(random.NextDouble() * 4.0, 2),

                // 结构体类型
                Location = new Point(random.Next(0, 100), random.Next(0, 100)),
                ClassSize = new Size(random.Next(30, 60), random.Next(20, 40)),

                // 集合类型
                Marks = Enumerable.Range(0, 5).Select(_ => random.Next(60, 100)).ToArray(),
                Courses = new List<string>
                {
                    $"Course_{random.Next(100, 999)}",
                    $"Course_{random.Next(100, 999)}",
                    $"Course_{random.Next(100, 999)}"
                },

                // 特殊类型
                Grade = (char)('A' + random.Next(0, 5))
            };
        }

        /// <summary>
        /// 测试用学生类(覆盖8种不同数据类型)
        /// </summary>
        private class Student
        {
            // 基础值类型
            public int Id { get; set; }

            // 字符串类型
            public string Name { get; set; }

            // 浮点类型
            public double GPA { get; set; }

            // 结构体类型(Point)
            public Point Location { get; set; }

            // 结构体类型(Size)
            public Size ClassSize { get; set; }

            // 数组类型
            public int[] Marks { get; set; }

            // 泛型集合
            public List<string> Courses { get; set; }

            // 字符类型
            public char Grade { get; set; }
        }

读取CSV文件,还原成对象数组:

// 读取还原数据
var serializer = new CsvSerializer();
var loadedData = serializer.ConvertFromCsvLines<Student>(File.ReadAllLines("test_data.csv"));

三、安装部署指南

通过NuGet包管理器安装:
在这里插入图片描述
通过NuGet包管理器执行:

Install-Package STTech.CodePlus

或使用.NET CLI:

dotnet add package STTech.CodePlus

四、感谢阅读

感谢各位读者耐心阅读,本库将持续迭代工业领域实用组件。如有建议可评论区留言,期待您的使用反馈!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL:语言基础与数据库操作

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

蓝桥杯学习——二叉树+奇点杯题目解析

基础认知 一、二叉树种类&#xff1a; 1.满二叉树。记深度k&#xff0c;节点数量2^k-1。 2.完全二叉树&#xff1a;除了底层&#xff0c;其余全满&#xff0c;底部从左到右连续。 3&#xff0c;平衡二叉搜索树&#xff1a;左子树和右子树高度差不大于1。 二、存储方式&…

基于django+vue的购物商城系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…

卷积神经网络 - 汇聚层

卷积神经网络一般由卷积层、汇聚层和全连接层构成&#xff0c;本文我们来学习汇聚层。 汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer)&#xff0c;其作用是进 行特征选择&#xff0c;降低特征数量&#xff0c;从而减少参数数量。 卷积层虽然可以显著减少网络中连接的…

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…

Nodejs使用redis

框架&#xff1a;koa&#xff0c;通过koa-generator创建 redis: 本地搭建&#xff0c;使用默认帐号&#xff0c;安装说明地址以及默认启动设置&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 中间件&#x…

GitHub 超火的开源终端工具——Warp

Warp 作为近年来 GitHub 上备受瞩目的开源终端工具&#xff0c;以其智能化、高性能和协作能力重新定义了命令行操作体验。以下从多个维度深入解析其核心特性、技术架构、用户评价及生态影响力&#xff1a; 一、背景与核心团队 Warp 由前 GitHub CTO Jason Warner 和 Google 前…

计算机视觉技术探索:美颜SDK如何利用深度学习优化美颜、滤镜功能?

时下&#xff0c;计算机视觉深度学习正在重塑美颜技术&#xff0c;通过智能人脸检测、AI滤镜、深度美肤、实时优化等方式&#xff0c;让美颜效果更加自然、精准、个性化。 那么&#xff0c;美颜SDK如何结合深度学习来优化美颜和滤镜功能&#xff1f;本文将深入解析AI在美颜技术…

应用商店上新:Couchbase Enterprise Server集群

可移植的冗余数据平台&#xff0c;这往往是创建可扩展的云原生应用程序的先决条件。而不依赖特定平台的工具可用于为多云、多区域工作负载提供企业级应用所需的灵活性。 ​Couchbase是一种高性能NoSQL数据库&#xff0c;专为当今复杂的云生态系统所需的动态扩展能力而设计。最近…

Redis解决缓存击穿问题——两种方法

目录 引言 解决办法 互斥锁&#xff08;强一致&#xff0c;性能差&#xff09; 逻辑过期&#xff08;高可用&#xff0c;性能优&#xff09; 设计逻辑过期时间 引言 缓存击穿&#xff1a;给某一个key设置了过期时间&#xff0c;当key过期的时候&#xff0c;恰好这个时间点对…

集成学习之随机森林

目录 一、集成学习的含义 二、集成学习的代表 三、集成学习的应用 1、分类问题集成。&#xff08;基学习器是分类模型&#xff09; 2、回归问题集成。&#xff08;基学习器是回归模型&#xff09; 3、特征选取集成。 四、Bagging之随机森林 1、随机森林是有多个决策树&a…

在线JSON格式校验工具站

在线JSON校验格式化工具&#xff08;Be JSON&#xff09;在线,JSON,JSON 校验,格式化,xml转json 工具,在线工具,json视图,可视化,程序,服务器,域名注册,正则表达式,测试,在线json格式化工具,json 格式化,json格式化工具,json字符串格式化,json 在线查看器,json在线,json 在线验…

SAP的WPS导出找不到路径怎么办;上载报错怎么办

一.打开注册编辑器 二.输入以下地址 计算机\HKEY_CLASSES_ROOT\ExcelWorksheet\Protocol\StdFileEditing\Server 去除掉EXE后面的命令即可 二&#xff1a;WPS上载文件没反应怎么办 如何切换整合模式或多组件模式-WPS学堂 根据官方操作把整合模式改成多组件模式

Moonlight-16B-A3B: 变革性的高效大语言模型,凭借Muon优化器打破训练效率极限

近日&#xff0c;由Moonshot AI团队推出的Moonlight-16B-A3B模型&#xff0c;再次在AI领域引发了广泛关注。这款全新的Mixture-of-Experts (MoE)架构的大型语言模型&#xff0c;凭借其创新的训练优化技术&#xff0c;特别是Muon优化器的使用&#xff0c;成功突破了训练效率的极…

rust学习笔记17-异常处理

今天聊聊rust中异常错误处理 1. 基础类型&#xff1a;Result 和 Option&#xff0c;之前判断空指针就用到过 Option<T> 用途&#xff1a;表示值可能存在&#xff08;Some(T)&#xff09;或不存在&#xff08;None&#xff09;&#xff0c;适用于无需错误信息的场景。 f…

PyTorch系列教程:使用预训练语言模型增强文本分类

文本分类仍是自然语言处理&#xff08;NLP&#xff09;领域的一项基础任务&#xff0c;其目标是将文本数据归入预先设定的类别之中。预训练语言模型的出现极大地提升了这一领域的性能。本文将探讨如何利用 PyTorch 来利用这些模型&#xff0c;展示它们如何能增强文本分类任务。…

LabVIEW 线性拟合

该 LabVIEW 程序实现了 线性拟合&#xff08;Linear Fit&#xff09;&#xff0c;用于计算给定一组数据点的斜率&#xff08;Slope&#xff09;和截距&#xff08;Intercept&#xff09;&#xff0c;并将结果可视化于 XY Graph 中。本案例适用于数据拟合、实验数据分析、传感器…

nacos安装,服务注册,服务发现,远程调用3个方法

安装 点版本下载页面 服务注册 每个微服务都配置nacos的地址&#xff0c;都要知道 服务发现 2个是知道了解 远程调用基本实现 远程调用方法2&#xff0c;负载均衡API测试 远程调用方法3&#xff0c;注解 负载均衡的远程调用&#xff0c; 总结 面试题

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

&#x1f4cc; 下载JMeter 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 无需安装 Apache官网下载 JMeter 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目…