[2020铁人赛] Day28 - 用CsvHelper读写csv档案

公司最近有个需求要处理csv档案,必须要将资料库资料转成csv汇出,而且希望每个资料都有双引号,并以逗号分隔,同时也希望能读取csv档案,并把资料更新置资料库中。Nuget上有很多元件可以做到,但用来用去还是推荐CsvHelper,在Nuget上下载量有高人气,足以证明其轻巧好用。

前置准备
如果是使用.net Framework则不需要安装编码套件,若是使用.net core架构,必须先安装编码套件,若直接使用会发生如下exception,以Big5为例

ArgumentException: 'Big5' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

故在Nuget上安装System.Text.Encoding.CodePages
https://ithelp.ithome.com.tw/upload/images/20201013/20111766EL8IKsAooh.png
安装完成需注册,放在程序的第一行

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

接着安装CsvHelper,同样也是在Nuget上下载
https://ithelp.ithome.com.tw/upload/images/20201013/20111766nKu17Aqpif.png

建立模型要接资料

public class TestModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

将资料汇出成csv档案

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var ms = new MemoryStream();
var list = GetTestList(); //去资料库取得list资料
using (TextWriter writer = new StreamWriter(ms, System.Text.Encoding.UTF8))
            {
                var csv = new CsvHelper.CsvWriter(writer);
                csv.Configuration.QuoteAllFields = true;//双引号隔开,预设是没有双引号
                csv.WriteRecords(list);
            }
            byte[] bytes = ms.ToArray();

产出csv结果
"Id","Name","Age" <-换行
"1","Scott","30"<-换行

接着把结果的这个档案再丢进去读取看看

读取csv档案

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//file为前端丢过来的档案,为csv档
using (var ms = new MemoryStream(file))
                {
                    //可使用big5,但.net core需安装System.Text.Encoding.CodePages套件
                    using (var reader = new StreamReader(ms, Encoding.GetEncoding("big5")))
                    {
                        using (var csv = new CsvHelper.CsvReader(reader))
                        {
                            ms.Seek(0, SeekOrigin.Begin);
                            var records = csv.GetRecords<TestModel>().ToList();//转成list,csv第一列栏位需对应class
                            //records为一笔资料的list
                                foreach (TestModel record in records)
                                {
                                    //可针对每笔资料去做事情
                                    record.Id ->1
                                    record.Name -> "Scott"
                                    record.Age -> 30
                                }
                            }
                        }
                    }
                }

参考资料
https://www.cnblogs.com/artech/p/encoding-registeration-4-net-core.html
https://joshclose.github.io/CsvHelper/


<<:  会员管理网站实作篇- (以律师谘询平台为例子) part3

>>:  [DAY 28] 回传 Gazebo 当中机器人之座标

laravel 8 (一) 建立专案及资料库设定

安装专案 composer global require laravel/installer //将...

CIA作为安全目标(CIA as security objectives)

根据FISMA的说法,“完整性意味着防止不当的信息修改或破坏,并且包括确保信息的不可否认性和真实性...

【C#】Creational Patterns Abstract Factory Mode

The Abstract Factory pattern provides an interface...

学习Python纪录Day29 - 简易版会飞的小鸟

铁人赛学习纪录来到了第28天,今天想来做点轻松的,决定用python做一只会飞的小鸟 首先大概设计一...

Day12# interface

第 12 天要来介绍 interface 那麽话不多说,我们就进入正题吧 ─=≡Σ(((っ゚∀゚)っ...