欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#使用Linq to csv读取.csv文件数据

程序员文章站 2022-07-01 17:44:52
今日遇到了一个需要读取CSV文件类型的EXCEL文档数据的问题,原本使用NPOI的解决方案直接读取文档数据,最后失败了,主要是文件的类型版本等信息不兼容导致。其他同事有使用linq to csv的Nuget包,获取CSV文件数据的方式,感觉写法非常简单,且很快实现了我的需求,现分享给大家参考使用:L... ......

  前言:今日遇到了一个需要读取csv文件类型的excel文档数据的问题,原本使用npoi的解决方案直接读取文档数据,最后失败了,主要是文件的类型版本等信息不兼容导致。其他同事有使用linq to csv的nuget包,获取csv文件数据的方式,感觉写法非常简单,且很快实现了我的需求,现分享给大家参考使用:

  linqtocsv官方资料:https://www.codeproject.com/articles/25133/linq-to-csv-library  

 

  1-引用nuget包:linqtocsv:https://www.nuget.org/packages/linqtocsv

  2-创建csv帮助类:

public class csvhelper
    {
        public static list<t> read<t>(string path, csvfiledescription filedescription) where t : class, new()
        {
            csvcontext _csv = new csvcontext();
            return _csv.read<t>(path, filedescription).tolist();
        }
        public static list<t> read<t>(string path) where t : class, new()
        {
            csvcontext _csv = new csvcontext();
            csvfiledescription _filedescription = new csvfiledescription()
            {
                //首列数据是否含有列名
                firstlinehascolumnnames = true,
                //是否启用csvcolumn属性标记
                enforcecsvcolumnattribute = true,
                //是否忽略未知的行
                ignoreunknowncolumns = true,
                //是否启用outputformat格式转换数据
                useoutputformatforparsingcsvvalue = true,
                //是否启用属性下标读取数据
                usefieldindexforreadingdata = true,
                //文本编码格式
                textencoding = encoding.utf8
            };
            return _csv.read<t>(path, _filedescription).tolist();
        }
    }

  3-创建接受类t:

  备注:

  特性-name:表示映射的列名;

  fieldindex:映射的位置;举例中未按照顺序写全,请自行补充;

  canbenull:是否可以为null;

  outputformat:数据格式化字符串方式;   启用时间格式使用yyyymmddhhmmss自己根据数据调整;    含有小数点位的标记为c;   其他的类型请查阅资料

public class wp
        {
            /// <summary>
            /// 管理代码
            /// </summary>
            [csvcolumn(name = "administration code", fieldindex = 1, canbenull = false)]
            public string administrationcode { get; set; }/// <summary>
            /// 日期
            /// </summary>
            [csvcolumn(name = "date", fieldindex = 4, canbenull = false, outputformat = "yyyy-mm-dd hh:mm:ss")]
            public datetime date { get; set; }/// <summary>
            /// 支付金额
            /// </summary>
            [csvcolumn(name = "amount", fieldindex = 8, canbenull = false, outputformat = "c")]
            public decimal amount { get; set; }
        }

  4-使用方式:

csvhelper.read<ordertransaction.wp>(filepath);

 

  5-待解决疑问:

  上面的代码可以解决规范的csv文件数据的读取(即csv文件中不包含其他杂乱数据),如果文档的前几行含有一些其他说明信息的话,那么数据的读取可能遇到问题。而包里并没有提供可以设置开始读取数据的行数,所以,有点遗憾!