CsvHelper文档-4映射

类映射

有时候你的类成员和csv的header不一定对应,有时候你的csv文件根本就没有header行,你需要特别制定一个成员的index,你不能依靠.net中默认的顺序。在这些情况下,你可以创建一个类映射文件来映射类成员和csv文件字段。

为了创建一个类到csv文件的映射,你需要一个ClassMap,你可以映射任何公共成员(属性或者字段);

public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
} public sealed class MyClassMap : ClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id );
Map( m => m.Name );
}
}

上面这个例子其实就是把类和文件做个默认对应,也就是说,按照顺序,第一个Id对应的是csv的第一个字段Id,类推。

要使用这个映射文件,你需要在configuration中注册它

var csv = new CsvReader( textReader );
csv.Configuration.RegisterClassMap<MyClassMap>();

Configuration可以做一些设置,后面再说

引用映射

为了映射一个引用类型,你需要按照树结构引用成员就是了,深度没有限制。

public class A
{
public int Id { get; set; }
public B B { get; set; }
} public class B
{
public int Id { get; set; }
public C C { get; set; }
} public class C
{
public int Id { get; set; }
} public sealed class AMap : ClassMap<A>
{
public AMap()
{
Map( m => m.Id ).Name( "A" );
Map( m => m.B.Id ).Name( "B" );
Map( m => m.B.C.Id).Name( "C" );
}
}

自动映射

如果你在没有创建映射字段的情况下进行读写,映射文件会自动的创建并自动的应用。自动映射会在对象成员和文件字段之间按照默认的映射设定创建映射关系。你可以通过configuration来改变一些默认设定。如果有循环引用,自动映射会停止这个结点的深入,继续下一个结点。

你可以在映射文件中直接调用AutoMap方法,如果你只有少数几个需要自己映射的,你可以先用AutoMap来建立初始的映射,然后再手动将特殊的几个映射手动完成。

public class MyClass
{
public int Id { get; set; } public string Name { get; set; } public DateTime CreatedDate { get; set; }
} public sealed class MyClassMap : ClassMap<MyClass>
{
public MyClassMap()
{
AutoMap();
Map( m => m.CreatedDate ).Ignore();
}
}

选项

通过选项可以改变映射行为。

Name

可以指定Header的名称,读取的字段如果有多个名称,甚至可以制定多个名称。所有名称都会被检查一遍来查找对应的字段。写入的时候只会用到第一个字段。

// Single name
Map( m => m.Id ).Name( "id" ); // Multiple possible names
Map( m => m.Id ).Name( "id", "the_id", "Id" );

NameIndex

如果一个列名出现在多个列,可以在映射的时候直接指定这个列的Index(具体是相同Name的Index);

// Example header
id,name,id // Mapping
Map( m => m.Id ).Name( "id" ).Index( 1 );

Index

如果根本就没有header,可以直接指定列的Index,如果有Name,则优先使用Name再考虑Index。写入的时候都可以指定,确保列的位置正确。

Map( m => m.Id ).Index( 0 );

Default

指定一个默认值,如果读取的位置字段是空的话;(相当于替代字符

Map( m => m.Name ).Default( "empty" );

Constant

指定一个值作为读写字段的时候的常量,如此,使用这个值的时候会忽略映射设置。

Map( m => m.Name ).Constant( "never changes" );

Ignore

在读写的时候忽略某个字段;注意:如果一个成员已经被映射到一个引用成员,不管是用类映射文件,还是自动映射,调用这个方法都不会忽略所有已经被映射子成员。

Map( m => m.Name ).Ignore();

TypeConverter

当需要进行类型转换的时候,可以指定ITypeConverter接口;

Map( m => m.Name ).TypeConverter( new MyConverter() );
Map( m => m.Name ).TypeConverter<MyConverter>();

ConvertUsing

可以指定一个转换字段到成员,转换成员到字段的表达式;

// Convert to member
Map( m => m.Aggregate ).ConvertUsing( row => row.Get<int>( "A" ) + row.Get<int>( "B" ) ); // Block
Map( m => m.Aggregate ).ConvertUsing( row =>
{
var a = row.Get<int>( "A" );
var b = row.Get<int>( "B" );
return a + b;
} ); // Convert to field
Map( m => m.Aggregate ).ConvertUsing( m => $"A + B = {m.A + m.B}" ); // Block
Map( m => m.Aggregate ).ConvertUsing( m =>
{
var field = "A + B = ";
field += ( m.A + m.B ).ToString();
return field;
} );

Validate

当读取的时候可以指定一个表达式来验证字段,如果表达式返回false,则抛出ValidationException异常。

Map( m => m.Number ).Validate( field => !string.IsNullOrEmpty( field ) );

// Log error instead of throwing an exception.
Map( m => m.Number ).Validate( field =>
{
var isValid = !string.IsNullOrEmpty( field );
if( !isValid )
{
logger.AppendLine( $"Field '{field}' is not valid!" );
} return true;
} );```

CsvHelper文档-4映射的更多相关文章

  1. CsvHelper文档-6类型转换

    CsvHelper文档-6类型转换 CsvHelper使用类型转换器来转换string到对象,或者对象到string: ITypeConverter 类型转换器的结构,必须实现: public int ...

  2. CsvHelper文档-5配置

    CsvHelper文档-5配置 CsvHelper库被设计成快速且简单易用,但是有时候默认的是设置不符合要求,需要你自己改变一些东西.所以csvHelper内置了很多自定义设置选项来改变读写行为.特别 ...

  3. CsvHelper文档-2读

    CsvHelper文档-2读 这个库默认不需要做任何设置就可以很容易的使用它.如果你的类属性名称直接匹配csv的标题名称,那么可以按照下面的实例来用: (以下所有的代码都需要引用using csvhe ...

  4. CsvHelper文档-3写

    CsvHelper文档-3写 不用做任何设置,默认的情况下,csvhelper就可以很好的工作了.如果你的类的属性名称和csv的header名称匹配,那么可以按照下面的例子写入: var record ...

  5. CsvHelper文档-1前言

    CsvHelper文档-1前言 英文文档链接地址:CsvHelper Document 开源项目地址:CsvHelper 翻译于2018-1-5,原本可能会随时更新: 每一段代码都是经过我实际测试的, ...

  6. Elasticsearch6.4.3文档的映射

    已经把ElasticSearch的核心概念和关系数据库做了一个对比,索引(index)相当于数据库,类型(type)相当于数据表,映射(Mapping)相当于数据表的表结构.ElasticSearch ...

  7. ES 父子文档查询

    父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 ...

  8. elasticsearch 路由文档到分片

    路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...

  9. MongoDB - 文档之间的关系 + _sort和投影

    1. 文档对象之间的关系 一对一 (one TO one) - 例如: 夫妻 (一个丈夫 对应 一个妻子) - 在MongoDB中, 可以通过内嵌文档的形式来体现出一对一的关系 演示: 首先在 my_ ...

随机推荐

  1. Android性能监控

    Android性能监控 一.搭建Android性能测试环境,参见<Android性能测试之Monkey使用>中内容. 二.启动Android虚拟机,可以通过eclipse启动,也可以通过命 ...

  2. 安装maven提示ERROR: JAVA_HOME is set to an invalid directory.

    查询网上资料发现多种解决办法:有的是多写了分号,有的路径错误. 需要注意的是maven配置前需要配置好jdk的路径. 我的java_home 之前的配置为:C:\Program Files\Java\ ...

  3. 2019年,200道面试题打造最受企业欢迎的iOS程序猿!

    在2018年底,小编混迹在各种iOS交流群中,整理出了将近两百道大厂最喜欢在面试问到的问题,今天在这里分享给大家[免费获取方式在最后]!                           小编就不在 ...

  4. Java接口和抽象类详解

    父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...

  5. EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除

    原文链接:http://blog.csdn.net/fanbin168/article/details/51485969   批量插入 (17597条数据批量插入耗时1.7秒)   using Sys ...

  6. 自定义loading效果

    结合Font Awesome字体图标自定义loading效果 Font Awesome字体图标地址:http://www.fontawesome.com.cn/faicons/ 使用javascrip ...

  7. ElasticSearch优化系列二:机器设置(内存)

    预留一半内存给Lucene使用 一个常见的问题是配置堆太大.你有一个64 GB的机器,觉得JVM内存越大越好,想给Elasticsearch所有64 GB的内存. 当然,内存对于Elasticsear ...

  8. scala爬取指定地点的所有列车班次

    需求介绍: 爬取指定地点的所有全国相关的列车班次详情.将结果写进mysql. 步骤及所遇到的问题: 1.寻取全国站点静态信息   https://kyfw.12306.cn/otn/resources ...

  9. nRF52832 BLE_DFU空中升级OTA(三)准备升级工程(SDK14.2.0)

    准备需要加入DFU功能的工程 在工程main文件services_init函数中加入DFU服务 uint32_t err_code; // Initialize the async SVCI inte ...

  10. python教程(零)·前言

    本教程是作者根据自己学习python的经验写下的,一来是想将经验分享给对python同样感兴趣的小白(大神请忽略),二来是想借此加深本人对python的理解,温故而知新. 学习基础 本教程面向的读者, ...