CsvHelper使用

本文介绍了如何使用CsvHelper库在.NET中创建、读写CSV文件,包括创建ProductData类、MyCsv操作类的方法,以及常用特性如Index和Name的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录CsvHelper的使用方法

简介
CsvHelper 是一个用于读写 CSV 文件的.NET库。极其快速,灵活且易于使用。

CsvHelper 建立在.NET Standard 2.0 之上,几乎可以在任何地方运行。

我一般使用在对设备数据进行记录和读写。

1创建一个设备数据类

 public class ProductData
    {
        [Name("序号")]
        public int ID { get; set; }
        [Name("姓名")]
        public string Name { get; set; }
    }

2创建一个CSV的操作类

    public class MyCsv
    {
        private string _filrPath;

        public string FilePath
        {
            get { return _filrPath; }
            set { _filrPath = value; }
        }
        public MyCsv(string StrFilePath)
        {
            _filrPath = StrFilePath;
        }
        public void CreateCSVFileAndHeader()
        {
            if (!File.Exists(FilePath))
            {
                using (var writer = new StreamWriter(FilePath, true, Encoding.Default))
                using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
                {
                    csv.WriteRecords(new List<ProductData> { });
                }
            }
        }
        public void AppendData(List<ProductData> listdata)
        {
            // 使用追加模式打开文件,写入数据
            using (var streamWriter = new StreamWriter(FilePath, true, Encoding.Default))
            using (var csv = new CsvWriter(streamWriter, CultureInfo.InvariantCulture))
            {
                foreach (var record in listdata)
                {
                    csv.WriteRecord(record);
                    csv.NextRecord();
                }
            }
        }

        public List<ProductData> ReadCsvData()
        {
            if (File.Exists(FilePath))
            {
                using (var reader = new StreamReader(FilePath, Encoding.Default))
                {
                    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
                    {
                        List<ProductData> dataRecords = csv.GetRecords<ProductData>().ToList();
                        return dataRecords;
                    }
                }
            }
            else
            {
                return null;
            }      
        }
    }

3调用测试

1创建文件

  string filePath = "data.csv";
  MyCsv myCsv = new MyCsv(filePath);
 if (!File.Exists(filePath))
 {
 myCsv.CreateCSVFileAndHeader();            
 }   

2追加数据

  var records = new List<ProductData>
{
    new ProductData { ID = 3, Name = "元方" },
    new ProductData { ID = 4, Name = "伽罗" },
};
 MyCsv myCsv = new MyCsv("data.csv");
 myCsv.AppendData(records);

3读取数据

   MyCsv myCsv = new MyCsv("data.csv");
 var dataRecords = myCsv.ReadCsvData();
 
 dgv.DataSource = dataRecords;
  var data = dataRecords.Where(p => p.Name == "元方").FirstOrDefault()?.ID;

图片:
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin在这里插入图片描述

常用特性记录

Index
Index 特性用于标记字段顺序。
在读取文件时,如果没有标题,就只能通过顺序来确定字段。
在写入文件的时候,会按 Index 顺序写入。如果不想写入标题,也需要添加 csv.Configuration.HasHeaderRecord = false;

public class ProductData
{
    [Index(0)]
    public int ID { get; set; }

    [Index(1)]
    public string Name { get; set; }
}

Name
如果字段名称和列名不一致,可以使用 Name 属性。

public class ProductData
{
    [Name("id")]
    public int ID { get; set; }

    [Name("name")]
    public string Name { get; set; }
}
如果你不想使用`CsvHelper`库,也可以手动解析CSV文件,例如使用`StreamReader`逐行读取,并使用`Split()`方法分割每一行。下面是一个简单的示例,假设CSV文件的第一行是列名,其余行是数据: ```csharp using System; using System.IO; using System.Text; using System.Collections.Generic; class Program { static void Main(string[] args) { string filePath = "path_to_your_csv_file.csv"; List<List<string>> data = new List<List<string>>(); try { using (StreamReader reader = new StreamReader(filePath, Encoding.Default)) { // 读取第一行作为列头 string headerLine = reader.ReadLine(); if (headerLine != null) data.Add(headerLine.Split(',')); while (!reader.EndOfStream) { // 读取后续数据行 string line = reader.ReadLine(); if (line != null) { string[] values = line.Split(','); data.Add(values); } } } // 按照指定列降序排序 int sortOrderIndex = 0; // 这里替换成你要排序的实际列索引,从0开始 data = data.OrderByDescending(line => line[sortOrderIndex]).ToList(); // 打印排序后的数据 for (int i = 0; i < data.Count; i++) { Console.WriteLine($"Row {i + 1}: Column to Sort: {data[i][sortOrderIndex]}, Other Columns..."); } } catch (Exception ex) { Console.WriteLine($"Error reading CSV file: {ex.Message}"); } } } ``` 在这个例子中,你需要自己处理可能出现的错误,如文件不存在、格式不正确等。另外,对于大规模数据或复杂的处理需求,手动解析可能会变得繁琐。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值