C# 读取 CSV 文件的方法汇总

文章目录

  • 1. 使用System.IO命名空间中的类
  • 2. 处理标题行和指定列
  • 3. 使用CsvHelper库
  • 4. 高级功能和异常处理
  • 5. 使用 LINQ
  • 6. 总结

在这里插入图片描述


CSV(Comma-Separated Values,逗号分隔值)文件是一种简单的文本文件格式,用于存储表格数据。在C#中,有多种方法可以用于读取CSV文件。本文将介绍几种常见的读取CSV文件的方法,包括使用System.IO命名空间中的类、使用CsvHelper库以及使用LINQ。

1. 使用System.IO命名空间中的类

System.IO命名空间提供了基本的文件读取功能。以下是一个使用StreamReader读取CSV文件的基本示例:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.csv";
        string line;
        Encoding encoding = Encoding.UTF8; // 设置文件编码方式

        // 使用 StreamReader 读取 CSV 文件
        using (StreamReader reader = new StreamReader(filePath, encoding))
        {
            while ((line = reader.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }
    }
}

在这个示例中,我们使用StreamReader类读取CSV文件,并设置了文件的编码方式为UTF-8。你可以根据实际需求更改编码方式,如GBK等。

2. 处理标题行和指定列

CSV文件通常包含标题行,以下是一个读取标题行和指定列的示例:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.csv";
        string line;
        Encoding encoding = Encoding.UTF8; // 设置文件编码方式

        // 使用 StreamReader 读取 CSV 文件
        using (StreamReader reader = new StreamReader(filePath, encoding))
        {
            // 读取标题行
            var header = reader.ReadLine();
            var headers = header.Split(',');

            // 读取指定列
            while ((line = reader.ReadLine()) != null)
            {
                var fields = line.Split(',');
                Console.WriteLine($"{headers[0]}: {fields[0]}, {headers[1]}: {fields[1]}");
            }
        }
    }
}

在这个示例中,我们首先读取标题行,然后使用标题行中的列名输出指定列的数据。

3. 使用CsvHelper库

CsvHelper是一个流行的第三方库,用于处理CSV文件。首先,你需要在项目中安装CsvHelper包,可以通过NuGet包管理器进行安装:

Install-Package CsvHelper

然后,使用CsvHelper的CsvReader类读取CSV文件:

using CsvHelper;
using CsvHelper.Configuration;
using System;

class Program
{
    static void Main()
    {
        string filePath = "example.csv";
        var config = new CsvConfiguration { HasHeaderRecord = true };

        // 使用 CsvReader 读取 CSV 文件
        using (var reader = new CsvReader(File.OpenRead(filePath), config))
        {
            var records = reader.GetRecords<dynamic>();
            foreach (var record in records)
            {
                Console.WriteLine($"{record.Field1}, {record.Field2}, {record.Field3}");
            }
        }
    }
}

在这个示例中,我们使用CsvReader类读取CSV文件,并使用GetRecords()方法将记录转换为动态对象。

4. 高级功能和异常处理

在使用CsvHelper库时,你可以采取一些高级功能,如数据验证或异常处理。以下是一个示例:

using CsvHelper;
using CsvHelper.Configuration;
using System;

class Program
{
    static void Main()
    {
        string filePath = "example.csv";
        var config = new CsvConfiguration { HasHeaderRecord = true };
          // 使用 CsvReader 读取 CSV 文件
        using (var reader = new CsvReader(File.OpenRead(filePath), config))
        {
            reader.Read();
            // 验证标题行
            if (reader.HeaderRecord.Any(header => header == "InvalidField"))
            {
                throw new InvalidDataException("CSV文件包含无效字段。");
            }

            var records = reader.GetRecords<dynamic>();
            foreach (var record in records)
            {
                // 验证记录
                if (record.Field1 == "InvalidValue")
                {
                    throw new InvalidDataException("CSV文件包含无效值。");
                }
                Console.WriteLine($"{record.Field1}, {record.Field2}, {record.Field3}");
            }
        }
    }
}

在这个示例中,我们首先读取标题行,然后验证标题行和记录中的字段是否包含无效数据。如果包含无效数据,我们将抛出异常。

5. 使用 LINQ

LINQ(Language Integrated Query)提供了一种简洁的方式来进行数据查询。以下是一个使用 LINQ 读取 CSV 文件的示例:

using System;
using System.Linq;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.csv";
        string[] lines = File.ReadAllLines(filePath);

        foreach (var line in lines)
        {
            string[] fields = line.Split(',');
            Console.WriteLine($"{fields[0]}, {fields[1]}, {fields[2]}");
        }
    }
}

在这个示例中,我们使用 File.ReadAllLines() 方法读取 CSV 文件的所有行,然后使用 Split() 方法分割每一行的字段,并输出到控制台。

6. 总结

在C#中,有多种方法可以用于读取CSV文件,包括使用System.IO命名空间中的类、使用CsvHelper库以及使用LINQ。你可以根据具体的需求和场景选择最适合的方法。希望本文能够帮助你更好地理解和使用这些方法。

在实际应用中,读取CSV文件时需要注意以下几点:

  1. 确保文件的编码方式与代码中的编码方式一致,否则可能导致乱码。
  2. 如果CSV文件中的数据包含特殊字符(如逗号、引号等),可能需要进行转义处理。
  3. 使用第三方库(如CsvHelper)时,确保已经安装了相应的包,并正确引用了相关的命名空间。
  4. 在处理CSV文件时,考虑数据的验证和异常处理,以确保程序的稳定性和数据的准确性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于pdfbox读取pdf

最近&#xff0c;想着将pdf的文件进行读取其内容&#xff0c;发现了一个比较好用的依赖pdfbox。目前使用这个依赖&#xff0c;进行实现一个简单实例&#xff0c;如果之后需要使用到更深的了解&#xff0c;会进行更新。这里提醒一下&#xff1a;jdk8尽量采用pdfbox3.x版本。 对…

磁珠笔记汇总

磁珠笔记汇总 磁珠是和电感很相似的器件。 电感磁珠单位亨(H)欧姆(Ω)是否储能存储能量消耗高频能量应用场景通常用于开关电源吸收高频&#xff0c;EMC保护如何看待损耗使用电感时希望损耗越小越好使用磁珠时是利用其损耗来消耗不需要的高频分量 一、磁珠的工作原理 磁珠与…

代码随想录——左叶子之和(Leetcode404)

题目链接 BFS 队列 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

FreeRTOS_信号量_学习笔记

信号量的特性 消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递状态&#xff0c;这个状态值需要用一个数值表示。套用队列笔记中的流水线例子&#xff0c;可以理解为流水线上工件的数量。 信号&#xff1a;起通知作用 量&#xff1a;还可以用来表示资源的数量 当…

SNP数据转型解析:云服务在现代企业数字化转型的必要性

为什么当今的企业想为数字化工作环境做好准备并保持竞争力&#xff0c;很难避免使用云服务呢&#xff1f; 要理解为什么企业没有云的替代选择&#xff0c;我们需要了解云服务的含义 - 它不仅仅指存储数据的另一个位置。各种云模型提供了极大的灵活性&#xff0c;可以根据需要操…

安卓开机启动阶段

目录 概述一、boot_progress_start二、boot_progress_preload_start三、boot_progress_preload_end四、boot_progress_system_run五、boot_progress_pms_start六、boot_progress_pms_system_scan_start七、boot_progress_pms_data_scan_start八、boot_progress_pms_scan_end九、…

Linux:IPC - System V

Linux&#xff1a;IPC - System V 共享内存 shm创建共享内存shmgetshmctlftok 挂接共享内存shmatshmdt shm特性 消息队列 msgmsggetmsgctlmsgsndmsgrcv 信号量 semSystem V 管理机制 System V IPC 是Linux系统中一种重要的进程间通信机制&#xff0c;它主要包括共享内存 shm&am…

[RK3588-Android12] 关于ES8388 喇叭+PDM回采 4+2配置

问题描述&#xff1a; ES8388 喇叭PDM回采 42配置如下&#xff1a; 解决方案&#xff1a; // MICpdmics: dummy-codec {status "okay";compatible "rockchip,dummy-codec";#sound-dai-cells <0>;};// MICpdm_mic_array: pdm-mic-array {status …

“一带一路”六国国际拳王冠军赛特克斯站新闻发布会顺利举行

实习记者&#xff1a;喀兰姆罕 5月24日&#xff0c;“一带一路”六国国际拳王冠军赛特克斯站新闻发布会在特克斯县阿克塔斯姑娘峰景区举行。这次拳王冠军赛事由新疆广播电视台、特克斯镇人民政府&#xff0c;特克斯县文化体育广播电视和旅游局主办&#xff0c;将于6月15日在特…

设计模式18—— 迭代器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 迭代器模式&#xff08;Iterat…

vue系列之 插槽(Slot) 详解

插槽在vue中是一种很常见的写法&#xff0c;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式。一共有三种分类&#xff1a;默认插槽、具名插槽、作用域插槽&#xff0c;下面一一结合案例详细说明。原创不易&#xff0c;需要的小伙伴 收藏关注 哦…

最新斗音评论区截流拓客,自动引流【引流软件+使用教程】

面对社交媒体的蓬勃生长&#xff0c;加粉和拓展客户群成为品牌及个体的当务之急。新推出的一款技术工具恰到好处地迎合了这一需求&#xff0c;提供了一个多功能、适用性强的增粉与互动解决方案。该工具与抖音平台的所有版本兼容&#xff0c;消除了对特定版本的依赖。 利用这一…

浅揭秘:Java方法调用过程中栈内存到底干了什么

在深入Java编程的世界时&#xff0c;理解其方法调用背后的内存管理机制是至关重要的。 Java作为一种面向对象的语言&#xff0c;其内存管理自动化程度高&#xff0c;但背后涉及的原理却错综复杂&#xff0c;尤其是方法调用过程中的栈帧、堆、方法区等概念。 本文将通过代码示…

【实用的 IDEA 配置和操作技巧总结】

前置知识 IDEA的设置快捷键为ctrlalts键&#xff0c;后文介绍IDEA常见的配置就不再赘述这一点了。 基础配置 取消默认打开上次项目 日常开发都会打开不同的项目&#xff0c;初次安装IDEA之后&#xff0c;每次打开IDEA都会开启上一次启动的项目&#xff0c;所以我们需要进入设…

话术巧妙分隔沟通效果更佳看看这个小技巧

客服回复客户咨询&#xff0c;如果遇到比较复杂的问题&#xff0c;经常会有大段的文字回复&#xff0c;用聊天宝的分段符功能&#xff0c;在需要分段的地方点击右上角的“插入分隔符”&#xff0c;就可以在指定位置分段&#xff0c;实现多段发送的目的。 前言 客服回复客户咨询…

NSS‘题目练习3

[SWPUCTF 2021 新生赛]easyupload3.0 打开题目发现要求上传.jpg文件 先上传抓包&#xff0c;尝试更改后缀 换一种形式 文件头绕过 都试过之后尝试上传.htaccess文件&#xff0c;发现上传成功 会将之后上传的文件后缀自动更名为.php 再上传.jpg文件 蚁剑连接找到flag [SWPUCTF …

读书短视频脚本:四川京之华锦信息技术公司

读书短视频脚本&#xff1a;打造引人入胜的文学世界 随着短视频平台的兴起&#xff0c;各类内容以更加直观、生动的方式呈现在观众面前。在这个信息爆炸的时代&#xff0c;如何将书籍的精华和魅力通过短视频这一新兴媒介传递给更多人&#xff0c;成为了一个值得探讨的话题。四…

部署CNI网络组件+k8s多master集群部署+负载均衡

一、环境部署 主机服务 192.168.91.5 K8S集群master01192.168.91.8 K8S集群master02192.168.91.6K8S集群node01192.168.91.7K8S集群node02192.168.91.9 负载均衡nginxkeepalive01&#xff08;master&#xff09;192.168.91.10 负载均衡nginxkeepalive02&#xff08;backup&am…

港口与航运3D三维虚拟仿真展区让更多人了解到海洋知识

在短短20天内&#xff0c;搭建起200多家线上3D展厅&#xff0c;听起来似乎是一项艰巨的任务。然而&#xff0c;对于我们的3d云展平台而言&#xff0c;这早已成为常态。连续三年&#xff0c;我们已成功为众多会展公司在短时间内构建出几百家甚至上千家的线上3D展会&#xff0c;见…

4、xss-labs之level4、lecel5

一、level4 1、测试分析 level4跟之前的3一样的思路&#xff0c;闭合value的值&#xff0c;但是通过双引号闭合&#xff0c;然后使用onclick的属性弹窗绕过 输入3的payload&#xff1a; 2、所以构造payload payload&#xff1a;"οnclickalert(1)// 二、level5 1、测…