CsvHelper文档-5配置
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配置的更多相关文章
- CsvHelper文档-6类型转换
CsvHelper文档-6类型转换 CsvHelper使用类型转换器来转换string到对象,或者对象到string: ITypeConverter 类型转换器的结构,必须实现: public int ...
- CsvHelper文档-4映射
CsvHelper文档-4映射 类映射 有时候你的类成员和csv的header不一定对应,有时候你的csv文件根本就没有header行,你需要特别制定一个成员的index,你不能依靠.net中默认的顺 ...
- CsvHelper文档-3写
CsvHelper文档-3写 不用做任何设置,默认的情况下,csvhelper就可以很好的工作了.如果你的类的属性名称和csv的header名称匹配,那么可以按照下面的例子写入: var record ...
- CsvHelper文档-2读
CsvHelper文档-2读 这个库默认不需要做任何设置就可以很容易的使用它.如果你的类属性名称直接匹配csv的标题名称,那么可以按照下面的实例来用: (以下所有的代码都需要引用using csvhe ...
- CsvHelper文档-1前言
CsvHelper文档-1前言 英文文档链接地址:CsvHelper Document 开源项目地址:CsvHelper 翻译于2018-1-5,原本可能会随时更新: 每一段代码都是经过我实际测试的, ...
- solr schema.xml文档节点配置
首先,讲解一下/usr/local/solr/collection1/conf/schema.xml的配置,此文档功能类似于配置索引数据库. Field:类似于数据库字段的属性(此文统一使用用“字段” ...
- 转: seajs手册与文档之 -- 配置选项
config alias preload debug map base charset timeout noConflict config 可以使用 config 方法来配置seajs. seajs. ...
- ABP文档笔记 - 配置、设置、版本、功能、权限
配置 全局仅一个单例,保存一组配置信息,一般直接在模块的预启动事件中赋值or修改.没有Scope划分,无论租户还是房东亦或者用户读取的值都不会有差异.每个模块都可以扩展这个配置. 设置 它没有层级关系 ...
- 大数据项目之_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. ...
随机推荐
- Java解析Excel之应用Reflection等技术实现动态读取
目录树 背景 技术选型 问题分析 技术要点及难点分析 源码分析 测试用例 背景 Tip:因为产品提的需求我都开发完了,进行了项目提测:前天老大走过来说:你用spring-boot开发一个解析Excel ...
- 03_Docker入门(上)之容器创建、容器使用、容器删除
运维架构服务docker:docker入门 一.确保docker就绪 查看docker程序是否存在,功能是否正常 Docker可执行程序的info命令,该命令会返回所有容器和镜像的数量.Docker使 ...
- volatile关键字到底做了什么?
话不多说,直接贴代码 class Singleton { private static volatile Singleton instance; private Singleton(){} //双重判 ...
- $(document).ready(function(){})与window.load
$(document).ready(function(){ //to do something}) 是当文档全部加载完全的时候触发,包括img也加载完成但是相关的文件没有下载下来,能同时编写多个 wi ...
- ERP系统和MES系统的区别
公司说最近要上一套erp系统,说让我比较一下,erp系统哪个好,还有mes系统,我们适合上哪个系统,其实我还真的不太懂,刚接触erp跟mes的时候,对于两者的概念总是傻傻分不清楚,总是觉得既然都是为企 ...
- 个人对js闭包的心得见解
谈起闭包很多人都会挠头.我以前也是,因此我查阅了很多资料,综合分析和理解,自认现在已经识得了闭包的真面目.下面我就从闭包的产生条件,闭包的作用,闭包的实质,闭包的本质,闭包产生的时机,闭包的应用 等几 ...
- 随记181120Service Fabric问题
https://github.com/Azure/service-fabric-issues/issues/1056 不能启动node one /five 问题
- opencv移植(一)cmake安装
原文:https://blog.csdn.net/Guet_Kite/article/details/78667175?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接 ...
- ruby rspec+jenkins+ci_report持续集成生成junit测试报告
1.加载ci_report gem install ci_reporter_rspec 2.给测试工程编写rakefile require 'ci/reporter/rake/rspec' requi ...
- 【leetcode 简单】 第五十二题 有效电话号码
给定一个文本文件 file.txt,请只打印这个文件中的第十行. 示例: 假设 file.txt 有如下内容: Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Li ...