CsvHelper文档-5配置

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

恶意注入保护

来自逗号分割的脆弱性

很多现代的Web应用程序和框架提供了电子表格导出功能,允许用户下载数据到csv或者xls文档中并用Excel或者OpenOffice Calc来打开。电子表格的单元格里经常会包含不受信任的源,比如survey_response,transaction details 和用户应用地址。这潜在会有一些危险;因为任何单元格如果以=开始的话,都是被单元格当成一个公式。

另外一个好的文章The Absurdly Underestimated Dangers of CSV Injection

注入净化

净化字段可以防止恶意注入,当在外部程序当中使用csv文件的时候,一个字段当中的公式是能够被运行的,所以可能会带来脆弱。鉴于此,如果一个字段是以=,@,+或者-开始的,那么这个字段将会被加上\t后缀,如果一个字段被引用了,那么这个字段将在引号后面加上\t,净化覆盖了MS Excel,Google Sheets和OpenOffice Calc。

// Turn off sanitization.
csv.Configuration.SanitizeForInjection = false;

注入字符

这些字符会导致净化的发生

// Default.
csv.Configuration.InjectionCharacters = new [] { '=', '@', '+', '-' };

避开注入字符

下面这个字符将用来避开注入;

// Default.
csv.Configuration.InjectionEscapeCharacter = '\t';

Headers

HasHeaderRecord

默认情况下,CsvHelper会认为文件有一个header记录,如果你的文件不包含一个header记录,那么你可以把这个选项关闭。

csv.Configuration.HasHeaderRecord = false;

HeaderValidationCallback

当Header验证运行检查运行的时候,函数会被调用。默认的函数会在没有header用来匹配给定成员验证的时候,抛出一个ValidationException异常。

// Turn off header validation.
csv.Configuration.HeaderValidationCallback = null; // Log instead of throwing an exception.
csv.Configuration.HeaderValidationCallback = ( isValid, headerNames, headerNameIndex, context ) =>
{
if( !isValid )
{
logger.WriteLine( $"Header matching ['{string.Join( "', '", headerNames )}'] names at index {headerNameIndex} was not found." );
}
};

PrepareHeaderForMatch

准备一个header字段来匹配一个成员名称,header字段和成员名称都通过这个函数来运行。你可以裁剪,移除空格,移除下划线,进行大小写转换等。

// Trim
csv.Configuration.PrepareHeaderForMatch = header => header?.Trim(); // Remove whitespace
csv.Configuration.PrepareHeaderForMatch = header => header.Replace( " ", string.Empty ); // Remove underscores
csv.Configuration.PrepareHeaderForMatch = header => header.Replace( "_", string.Empty ); // Ignore case
csv.Configuration.PrepareHeaderForMatch = header => header.ToLower();

映射

配置类型映射

RegisterClassMap

添加一个类型映射文件后,可以在注册多个映射文件。如果你为同样的类型注册了多个映射,生效的会是最新的那个。

// Creates and adds a map for the given  class map type TMap.
csv.Configuration.RegisterClassMap<TMap>(); // Creates and adds a map for the given class map type
csv.Configuration.RegisterClassMap( classMapType ); // Adds the given class map.
csv.Configuration.RegisterClassMap( classMap );

UnregisterClassMap

移除一个类型映射文件;

// Removes the class map for the given class map type.
csv.Configuration.UnregisterClassMap<TMap>(); // Removes the class map for the given class map type.
csv.Configuration.UnregisterClassMap( Type classMapType ); // Removes all class maps.
csv.Configuration.UnregisterClassMap();

Maps

设置映射, ClassMapCollection类型拥有一些方法能够帮助管理类型映射。

// Finds the `ClassMap` for the given record type `TRecord`.
var map = csv.Maps.Find<TRecord>(); // Finds the `ClassMap` for the given type.
var map = csv.Maps[recordType];

AutoMap

自动使用默认的设置创建类型映射。

// Creates a ClassMap for given record type `TRecord`.
var map = csv.Configuration.AutoMap<TRecord>(); // Creates a ClassMap for the given type.
var map = csv.Configuration.AutoMap( recordType );

MemberTypes

指定自动映射的时候的成员映射类型

// Default.
csv.Configuration.MemberTypes = MemberTypes.Properties; // Fields.
csv.Configuration.MemberTypes = MemberTypes.Fields; // Both;
csv.Configuration.MemberTypes = MemberTypes.Properties | MemberTypes.Fields;

IncludePrivateMembers

自动映射的时候包含私有成员。这个设置只能用于写入,读取则需要使用构造函数映射。

// Turn on.
csv.Configuration.IncludePrivateMembers = true;
IgnoreReferences
Ignores reference members when auto mapping. Default is false. // Ignore reference members.
csv.Configuration.IgnoreReferences = true;

PrefixReferenceHeaders

将父类成员名称用作子类header的成员的前缀

// Turn on.
csv.Configuration.PrefixReferenceHeaders = true;

Constructor Mapping

如果你希望通过构造函数的参数来创建csv文件的字段,那么你应该使用这个选项。

ShouldUseConstructorParameters

Function to determine if constructor parameters should be used to create the class instead of the default constructor and member initialization.

设定是否用带有参数的构造函数来代替默认的构造函数和成员初始化去生成类。

// Default
csv.Configuration.ShouldUseConstructorParameters = type =>
!type.HasParameterlessConstructor()
&& type.HasConstructor()
&& !type.IsUserDefinedStruct()
&& !type.IsInterface
&& Type.GetTypeCode( type ) == TypeCode.Object; // Always use constructor parameters.
csv.Configuration.ShouldUseConstructorParameters = type => true; // Never use constructor parameters.
csv.Configuration.ShouldUseConstructorParameters = type => false;

GetConstructor

设置用于选择映射函数构造函数,默认选择参数最多的那个。

// Default
csv.Configuration.GetConstructor = type => type.GetConstructors().OrderByDescending( c => c.GetParameters().Length ).First();

Error Handling

当错误发生的时候,你可以改变行为来做一些事情而不是抛出异常,比如忽略错误或者记入日志。

BadDataFound

一个字段包含有问题的数据是指包含引号并且这个字段没有被避开。当这样的字段数据被发现的时候,调用的函数。

// Ignore bad data.
csv.Configuration.BadDataFound = null; // Log bad data.
csv.Configuration.BadDataFound = context =>
{
logger.WriteLine( $"Bad data found on row '{context.RawRow}'" );
};

MissingFieldFound

当一个Missing字段被发现的时候调用的函数,默认是抛出一个MissingFieldException异常。

// Ignore missing field.
csv.Configuration.MissingFieldFound = null; // Log missing field.
csv.Configuration.MissingFieldFound = ( headerNames, index, context ) =>
{
logger.WriteLine( $"Field with names ['{string.Join( "', '", headerNames )}'] at index '{index}' was not found. );
};

ReadingExceptionOccurred

当读取错误发生的时候调用的函数,默认的函数会再次抛出一个给定的异常。

// Ignore reading exception.
csv.Configuration.ReadingExceptionOccurred = null; // Log reading exception.
csv.Configuration.ReadingExceptionOccurred = exception =>
{
logger.WriteLine( $"Reading exception: {exception.Message}" );
};

类型转换

TypeConverterCache

管理类型转换器,你可以添加,移除,或者某个类型的类型转换器。

// Add converter for a type.
csv.Configuration.TypeConverterCache.AddConverter<MyClass>( converter );
csv.Configuration.TypeConverterCache.AddConverter( typeof( MyClass ), converter ); // Remove converter.
csv.Configuration.TypeConverterCache.RemoveConverter<MyClass>();
csv.Configuration.TypeConverterCache.RemoveConverter( typeof( MyClass ) ); // Get existing converter.
csv.Configuration.TypeConverterCache.GetConverter<MyClass>();
csv.Configuration.TypeConverterCache.GetConverter( typeof( MyClass ) );

TypeConverterOptionsCache

管理TypeConverterOptions,可以添加,移除,或者一个类型的选项。

// Add options for a type.
csv.Configuration.TypeConverterOptionsCache.AddOptions<MyClass>( options );
csv.Configuration.TypeConverterOptionsCache.AddOptions( typeof( MyClass ), options ); // Remove options.
csv.Configuration.TypeConverterOptionsCache.RemoveOptions<MyClass>();
csv.Configuration.TypeConverterOptionsCache.RemoveOptions( typeof( MyClass ) ); // Get existing options.
csv.Configuration.TypeConverterOptionsCache.GetOptions<string>().CultureInfo = CultureInfo.CurrentCulture;
csv.Configuration.TypeConverterOptionsCache.GetOptions( typeof( string )).CultureInfo = CultureInfo.CurrentCulture;

读取

DetectColumnCountChanges

如果在检测到不同行的列数不一样,就会抛出一个BadDataException异常,默认这个设置是false。

// Turn on.
csv.Configuration.DetectColumnCountChanges = true;

ShouldSkipRecord

当一个记录应该被跳过的时候,函数会被调用,默认返回false;

// Skip if all fields are empty.
csv.Configuration.ShouldSkipRecord = record =>
{
return record.All( string.IsNullOrEmpty );
};

IgnoreBlankLines

读取的时候忽略空行,空行就是没有字符的行,这个设置默认是打开着。

// Turn off.
csv.Configuration.IgnoreBlankLines = true; // A,B,C // Header.
// // When on, this row is skipped. When off, it will be just like the next row.
// ,, // Not ignored. All fields are empty.

转换

TrimOptions

设置修剪字段,TrimOptions.Trim就是把字段两边的空格去掉。TrimOptions.InsideQuotes 就是把引号内的空格也去掉。

csv.Configuration.TrimOptions = TrimOptions.Trim;
` field ` -> `field`
` " field " ` -> `" field "` csv.Configuration.TrimOptions = TrimOptions.InsideQuotes;
` field ` -> ` field `
` " field " ` -> ` "field" ` csv.Configuration.TrimOptions = TrimOptions.Trim | TrimOptions.InsideQuotes;
` " field " ` -> "field"

AllowComments

允许读取的时候注释,如果设置为开,每一行会以一个注释字符开始的会被认为是注释输出行,如果设置关,那么就是普通字段,默认是关。

// Turn on.
csv.Configuration.AllowComments = true;
BufferSize
The size of the buffer used when reading. Default is 2048; // Double the buffer size.
csv.Configuration.BufferSize = csv.Configuration.BufferSize * 2;

CountBytes

转换的时候记录字节数,默认是false,这个操作会减慢转换,因为它需要获取每个字符按照特定编码的字节数。 要设置Configuration.Encoding确保准确。

// Turn on.
csv.Configuration.CountBytes = true; // Get count.
var byteCount = csv.Context.BytePosition;

Encoding

设置记录字节数的编码

// Change to whatever the CSV file was encoded in.
csv.Configuration.Encoding = Encoding.Unicode;

Writing

QuoteAllFields

写入的时候引号所有的字段,忽略其他设定。QuoteAllFields 和 QuoteNoFields不能同时打开,只能使用一个。

// Turn on.
csv.Configuration.QuoteAllFields = true;

QuoteNoFields

写入的时候不适用引号,忽略其他设定。QuoteAllFields 和 QuoteNoFields不能同时打开,只能使用一个。

// Turn on.
csv.Configuration.QuoteNoFields = true;

UseNewObjectForNullReferenceMembers

Specifies if a new object should be created and used when a reference is null. If true, a new object is created and will have default values that are written. If false, all the fields will be empty. Default is true.

设定是否在引用为null的时候创建一个新对象。true,新的对象会被创建,会写入默认值。false,所有的字段为空,默认是true。

public class A
{
public int AId { get; set;}
public B B { get; set; }
} public class B
{
public int BId { get; set; }
} var list = new List<A>
{
new A { AId = 1 }
}; // Default.
csv.Configuration.UseNewObjectForNullReferenceMembers = true;
csv.WriteRecords( list ); // Output:
// AId,BId
// 1,0 // Turn off.
csv.Configuration.UseNewObjectForNullReferenceMembers = false;
csv.WriteRecords( list ); // Output:
// AId,BId
// 1,

Formatting

Delimiter

分割字段的符号,默认是逗号

// Default.
csv.Configuration.Delimiter = ",";

Quote

默认的引号

// Default.
csv.Configuration.Quote = '"';

Comment

用来去除已经被注释的行的符号

// Default.
csv.Configuration.Comment = '#';

CsvHelper文档-5配置的更多相关文章

  1. CsvHelper文档-6类型转换

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

  2. CsvHelper文档-4映射

    CsvHelper文档-4映射 类映射 有时候你的类成员和csv的header不一定对应,有时候你的csv文件根本就没有header行,你需要特别制定一个成员的index,你不能依靠.net中默认的顺 ...

  3. CsvHelper文档-3写

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

  4. CsvHelper文档-2读

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

  5. CsvHelper文档-1前言

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

  6. solr schema.xml文档节点配置

    首先,讲解一下/usr/local/solr/collection1/conf/schema.xml的配置,此文档功能类似于配置索引数据库. Field:类似于数据库字段的属性(此文统一使用用“字段” ...

  7. 转: seajs手册与文档之 -- 配置选项

    config alias preload debug map base charset timeout noConflict config 可以使用 config 方法来配置seajs. seajs. ...

  8. ABP文档笔记 - 配置、设置、版本、功能、权限

    配置 全局仅一个单例,保存一组配置信息,一般直接在模块的预启动事件中赋值or修改.没有Scope划分,无论租户还是房东亦或者用户读取的值都不会有差异.每个模块都可以扩展这个配置. 设置 它没有层级关系 ...

  9. 大数据项目之_15_帮助文档_NTP 配置时间服务器+Linux 集群服务群起脚本+CentOS6.8 升级到 python 到 2.7

    一.NTP 配置时间服务器1.1.检查当前系统时区1.2.同步时间1.3.检查软件包1.4.修改 ntp 配置文件1.5.重启 ntp 服务1.6.设置定时同步任务二.Linux 集群服务群起脚本2. ...

随机推荐

  1. mysql查询某个数据库表的数量

    在mysql中有个数据库information_schema下的表tables记录了所有数据库中所有的表相关信息 TABLE_SCHEMA 数据库名称 SELECT COUNT( * ) FROM i ...

  2. Android解析json数据

    Json数据 [{"code":"110000","sheng":"11","di":"0 ...

  3. Java并发编程(三)什么是线程池

    什么是线程池 学习编程的小伙伴们会经常听到“线程池”.“连接池”这类的词语,可是到底“池”是什么意思呢?我讲个故事大家就理解了:在很久很久以前有一家银行,一年之中只有一个客户来办理业务,随着时间的推移 ...

  4. C++练习 | 掷骰子走到第n步的方法数(DFS)

    玩家根据骰子的点数决定步数,骰子点数为1的时候走一步,以此类推.求玩家走到第n步总共有多少种投骰子的方法.输入为一个整数n,输出为投骰子的方法数. #include <iostream> ...

  5. ABAP术语-Update Data

    Update Data 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/20/1114169.html The data which is t ...

  6. Centos 下 mysql 安装过程

    1. 检查系统自带的Mysql,并卸载自带的版本 [root@iZ2366ycl7sZ config]# yum list installed |grep mysql mysql.x86_64 5.1 ...

  7. [转]Python爬虫html解析工具beautifulSoup在pycharm中安装及失败的解决办法

    原文地址:https://www.cnblogs.com/yysbolg/p/9040649.html 刚开始学习一门技术最麻烦的问题就是搞定IDE环境,直接在PyCharm里安装BeautifulS ...

  8. 全局变量和局部变量(global关键字)

    1.定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾. 2.函数内定义的变量就是局部变量,它的作用域为函数定义范围内. 3.函数之间存在作用域互不影响. 4.函数内访问全局变量需要 gl ...

  9. 浅析Vue.js 中的条件渲染指令

    1 应用于单个元素 Vue.js 中的条件渲染指令可以根据表达式的值,来决定在 DOM 中是渲染还是销毁元素或组件. html: <div id="app"> < ...

  10. PMP十五至尊图(第六版)

    PMP(Project Management Professinoal)项目经理专业资格认证,由美国项目管理学会PMI(Project Management Institute)发起并组织的一种资格认 ...