CvsHelper 使用指南
用于读取和写入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 使用指南的更多相关文章
- CSVHelper在Asp.Net MVC中的使用
1,从数据库读取数据,然后导出CSV文件 [HttpPost] public FileResult ExportCSV() { var apps =....//linq以及EF从数据库查询数据 Mem ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- UE4新手之编程指南
虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...
- JavaScript权威指南 - 对象
JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- Atitit.研发管理软件公司的软资产列表指南
Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...
- HA 高可用软件系统保养指南
又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...
- 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南
欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ...
随机推荐
- 代理server的理解(1):Windows环境下的代理server设置
浏览器中的代理server设置 Windows系统接口提供的代理server设置是一个全局的代理server的设置,如图所看到的,这里就不多解释: 各个浏览器在使用代理设置的时候,能够主动地获代替理设 ...
- PL/SQL Developer使用技巧、快捷键(转发)
转发自:https://www.cnblogs.com/linjiqin/archive/2013/06/24/3152538.html PL/SQL Developer使用技巧.快捷键 1.类SQL ...
- 的Linq未提交之前插入/修改时重新查询不准确问题
来园子已经两年了,每次都是看,这次咱也写一次. 说一下今天遇到的Linq问题: 每一次插入流水表时,都需要查找表中最大的流水号+1,并且将该流水号返回,但是在同一个SubmitChange之内插入多条 ...
- bzoj 4318 OSU! —— 期望DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4318 期望DP,因为平方的期望不等于期望的平方,所以用公式递推: 第一次推错了囧,还是看这位 ...
- LBS(定位)的使用
一.LBS(定位)的使用 1.使用框架Core Location 2.CLLocationManager (1)CoreLocation中使用CLLocationManager对象来做用户定位 (2) ...
- [Apple开发者帐户帮助]五、管理标识符(5)创建一个iCloud容器
您必须拥有一个或多个iCloud容器才能启用iCloud. 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左侧的弹出菜单中选择操作系统. 在“标识符”下,选择“iCloud容 ...
- Python 33(2)进程理论
一:什么是进程 进程指的是一个正在进行 / 运行的程序,进程是用来描述程序执行过程的虚拟概念 进程vs程序 程序:一堆代码 进程:程序的执行的过程 进程的概念起源于操作系统,进程是操作 ...
- CSS3 中弹性盒模型--容器的属性
1.display : flex | inline-flex注意,设为 Flex 布局以后,子元素的float.clear和vertical-align属性 将失效. 2.flex-direction ...
- U - Three displays
Problem description It is the middle of 2018 and Maria Stepanovna, who lives outside Krasnokamensk ( ...
- File入门及路径名问题
package com.io.file; import java.io.File; /** * @author 王恒 * @datetime 2017年4月20日 下午2:53:29 * @descr ...