用于读取和写入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. SqlService Date 格式化

    <choose> <when test="dateFlag=='day'"> ), FRI.INVOICE_DATE, ) AS CREATED_ON, & ...

  2. CentOS/ubuntu iscsi initior target

    http://docs.oracle.com/cd/E26926_01/html/E25884/fpjwy.html iscsiadm: initiator reported error (24 - ...

  3. jsp页面动态展示list-使用<select>和<c:forEach>标签

    转自:https://blog.csdn.net/zhugewochuang/article/details/80276466 后台:搜索数据放入list,然后为这个list提供响应的get和set方 ...

  4. [Apple开发者帐户帮助]五、管理标识符(3)删除应用程序ID

    您可以在不再需要时删除App ID.但是,您无法删除上载到App Store Connect的应用程序的显式应用程序ID . 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左 ...

  5. Electron桌面应用:环境搭建

    目录 一.简介 二.市场 三.安装 1.安装node版本 2.安装国内的npm包管理器 3.安装electron 4.验证electron否安装成功 5.使用git克隆一个electron简单的项目, ...

  6. python 9:list.reverse()(倒置原列表,可恢复改变)

    bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) bicycles.reverse() #倒置原列 ...

  7. Unity5.3.6升级到Unity5.4.4 NGUI出现Ignoring menu item NGUI because it is in no submenu!问题解决方案

    目录Assets/Plugins/NGUI/Scripts/Editor/NGUIMenu.cs文件中找到下图(左)所示,改成(右)图所示

  8. 题解报告:hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1850 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里 ...

  9. EntityFramewok 插入Mysql数据库 中文产生乱码解决

    首先Mysql表,建表的时候,有没有选择UTF8,如果是默认的编码latin1,就会产生乱码 这里修改后,还是乱码,那就要检查发生乱码的列是不是UTF8格式 然后修改App.Config或者Web.C ...

  10. JavaScript 原型和引用趣点

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...