用于读取和写入CSV文件的.NET库。 非常快速,灵活和易于使用。 支持读写自定义类对象。

入门

要安装CsvHelper,请从包管理器控制台运行以下操作。

Install-Package CsvHelper

读取所有记录

阅读所有记录很简单。 如果有一个的类结构的镜像CSV文件,可以将整个文件读入。

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>();

如果要自定义CSV文件映射到自定义类对象的方式,可以使用映射。(后面将会介绍)

返回的IEnumerable <T>将产生结果。 这意味着在实际访问数据之前不会返回结果。 因为整个文件将不会被加载到内存中,并且当您访问数据时,该文件将被读取。 如果您需要多次迭代记录(例如使用Count),则可以将所有内容加载到列表和数据的工作中。

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>().ToList();

逐条阅读记录

可以循环行并逐条读取它们。

var csv = new CsvReader( textReader );
while( csv.Read() )
{
var record = csv.GetRecord<MyClass>();
}

逐列阅读字段

也可以逐项读取每个字段。

var csv = new CsvReader( textReader );
while( csv.Read() )
{
var intField = csv.GetField<int>( );
var stringField = csv.GetField<string>( );
var boolField = csv.GetField<bool>( "HeaderName" );
}

尝试得到字段

如果你可能得到字段的类型有不一致的地方,你可以用trygetfield。

var csv = new CsvReader( textReader );
while( csv.Read() )
{
int intField;
if( !csv.TryGetField( , out intField ) )
{
// Do something when it can't convert.
}
}

  

读取一行(分析器)

您还可以直接使用分析器而不使用读取器。分析器将为读取的每一行返回一个字符串数组,当它完成时将返回null。        

var parser = new CsvParser( textReader );
while( true )
{
var row = parser.Read();
if( row == null )
{
break;
}
}            

写所有记录

如果你想有一个类结构镜像的CSV文件,你可以直接写整个文件。

var csv = new CsvWriter( textWriter );
csv.WriteRecords( records );

  

逐条写记录

您可以循环对象并逐条编写它们。

var csv = new CsvWriter( textWriter );
foreach( var item in list )
{
csv.WriteRecord( item );
}

逐列写字段

也可以逐项写每个字段。

var csv = new CsvWriter( textWriter );
foreach( var item in list )
{
csv.WriteField( "a" );
csv.WriteField( );
csv.WriteField( true );
csv.NextRecord();
}

 

映射

自动映射

如果不提供映射文件,将使用自动映射。 自动映射将按照它们显示的顺序映射类中的属性。如果属性是一个自定义类,它会按照它们显示的顺序递归地的属性类映射。如果自动映射器命中循环引用,那么它将 停止映射.

类的映射

如果您的CSV文件与自定义类不匹配,您可以使用一个类映射来设置类如何映射到文件的列。您需要在配置中注册您的类映射。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id );
Map( m = > m.Name );
}
}

 

引用地图

引用地图用于将自定义类的属性,将其映射到几个CSV列。您可以嵌套参考图的许多层深,只要你喜欢。

public sealed class PersonMap : CsvClassMap<Person>
{
public PersonMap()
{
Map( m => m.Id );
Map( m => m.Name );
References<AddressMap>( m => m.Address );
}
} public sealed class AddressMap : CsvClassMap<Address>
{
public AddressMap()
{
Map( m => m.Street );
Map( m => m.City );
Map( m => m.State );
Map( m => m.Zip );
}
}

指数

当通过索引映射时,您指定要为该属性使用的CSV列的索引。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id ).Index( );
Map( m => m.Name ).Index( );
}
}

  

列名

按列名映射时,指定要为该属性使用的CSV列的名称。要工作,CSV文件必须有头记录。指定的名称必须与头记录的名称匹配。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id ).Name( "The Id Column" );
Map( m => m.Name ).Name( "The Name Column" );
}
}

  

同名列索引

有时CSV文件有多个名称相同的列。 发生这种情况时,可以使用NameIndex来指定您所指的列名。 NameIndex不是CSV文件中的列,而是同名列的索引。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.FirstName ).Name( "Name" ).NameIndex( );
Map( m => m.LastName ).Name( "Name" ).NameIndex( );
}
}

  

默认

如果字段为空,默认值用于设置要使用的默认值。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public override void MyClassMap()
{
Map( m => m.Id ).Index( ).Default( - );
Map( m => m.Name ).Index( ).Default( "Unknown" );
}
}

  

类型转换器

如果CSV字段的值不能被自动转换为属性的类型,你可以指定一个自定义csvhelper.typeconversion.itypeconverter用来转换。有关如何创建自定义类型请看类型转换器的文档。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id ).Index( ).TypeConverter<MyIdConverter>();
}
}

  

类型转换器的设置

默认内置转换器将处理大多数类型转换的情况,但有时也有一些小的变化,你想做,但不想创建一个完整的新型转换器,只是一个int(例如)分析不同。您可以指定一些类型转换器选项来处理这些情况。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Description ).Index( ).TypeConverterOption( CultureInfo.InvariantCulture );
Map( m => m.TimeStamp ).Index( ).TypeConverterOption( DateTimeStyles.AdjustToUniversal );
Map( m => m.Cost ).Index( ).TypeConverterOption( NumberStyles.Currency );
Map( m => m.CurrencyFormat ).Index( ).TypeConverterOption( "C" );
Map( m => m.BooleanValue ).Index( ).TypeConverterOption( true, "sure" ).TypeConverterOption( false, "nope" );
}
}

使用转换
当一切都失败了,你可以用convertusing。convertusing允许您编写自定义代码内联转把行转换成一个单一的属性值。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
// Constant value.
Map( m => m.Constant ).ConvertUsing( row => );
// Aggregate of two rows.
Map( m => m.Aggregate ).ConvertUsing( row => row.Get<int>( ) + row.Get<int>( ) );
// Collection with a single value.
Map( m => m.Names ).ConvertUsing( row => new List<string>{ row.Get<string>( "Name" ) } );
// Just about anything.
Map( m => m.Anything ).ConvertUsing( row =>
{
// You can do anything you want in a block.
// Just make sure to return the same type as the property.
} );
}
}

运行时映射
地图可以在运行时创建。事实上,自动地图功能动态。你可以看看下面的链接的一些启示:https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/Configuration/CsvClassMap.cs#L91另一个简单的例子如下所示:

var customerMap = new DefaultCsvClassMap();

// mapping holds the Property - csv column mapping
foreach( string key in mapping.Keys )
{
var columnName = mapping[key].ToString(); if( !String.IsNullOrEmpty( columnName ) )
{
var propertyInfo = typeof( Customer ).GetType().GetProperty( key );
var newMap = new CsvPropertyMap( propertyInfo );
newMap.Name( columnName );
customerMap.PropertyMaps.Add( newMap );
}
} csv.Configuration.RegisterClassMap(CustomerMap);

CvsHelper 使用指南的更多相关文章

  1. CSVHelper在Asp.Net MVC中的使用

    1,从数据库读取数据,然后导出CSV文件 [HttpPost] public FileResult ExportCSV() { var apps =....//linq以及EF从数据库查询数据 Mem ...

  2. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  3. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  4. JavaScript权威指南 - 对象

    JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...

  5. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  6. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  7. Atitit.研发管理软件公司的软资产列表指南

    Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...

  8. HA 高可用软件系统保养指南

    又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...

  9. 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南

    欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ...

随机推荐

  1. Java图形用户界面编程

    1.Java图形用户界面编程概述 JavaAPI中提供了两套组件用于支持编写图形用户界面:AWT(抽象窗口包)和Swing 2.  容器(Container):重量级容器和轻量级容器(一个容器可以放置 ...

  2. Quartz实现执行任务记录数据库,方便计算任务的执行次数以及成功次数

    任务执行实体 /** * 任务执行情况详情 */ public class JobExecuteDetail implements Serializable{ /** * */ private sta ...

  3. Redis学习笔记(二):Redis集群

    集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.   1.节点 一个节点就是一个运行在集群模式下的Redis服务器.启动Redis服务器时,通过判断cluster-enabl ...

  4. POJ 3630 trie树

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26559 Accepted: 8000 Descripti ...

  5. RabbitMQ 官方NET教程(二)【工作队列】

    这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务. 工作队列的主要任务是:避免立刻执行资源密集型任务和避免必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送 ...

  6. centos下使用shell+expect远程登录主机

    # 安装expect yum install expect # 新建脚本文件running #!/usr/bin/expect spawn /usr/bin/ssh root@114.114.114. ...

  7. 5.13redis图形化工具---idea中配置redis密码

    安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目 源博客地址:https://www.cnblogs.com/cheng ...

  8. Bootstrap中container与container-fluid的区别

    /*0-768px以上宽度container为100%*/ .container { padding-right: 15px; padding-left: 15px; margin-right: au ...

  9. 【原创】python中文编码问题深入分析(三):python2.7文件读写中文编码问题

    上一篇文章介绍和分析了python2.7中使用print遇到的中文编码问题的原因和解决方案,本篇主要介绍一下python2.7中执行文件读写可能遇到的编码问题. 1.文件读取 假如我们读取一个文件,文 ...

  10. CodeForces 356A_(set应用,线段树)

    A. Knight Tournament time limit per test 3 seconds memory limit per test 256 megabytes input standar ...