CsvHelper文档-2读
CsvHelper文档-2读
这个库默认不需要做任何设置就可以很容易的使用它。如果你的类属性名称直接匹配csv的标题名称,那么可以按照下面的实例来用:
(以下所有的代码都需要引用using csvhelper命名空间)
var csv=new CsvReader(textReader);
var records=csv.GetRecords<MyClass>();
读取全部记录
最常用的场景是使用GetRecords方法。你可以指定任何你要想要返回的对象类型,然后它会返回一个能够让你迭代IEnumerable类型结果。也就是说,每次迭代的时候,内存当中每次都会是一个值,而不是一下子把整个文件全部读进来。在你实际开始迭代读取之前,数据并不会都被拉进来。
如果你想要是使用一个匿名对象类型作为你的记录,你可以提供一个类型定义来获得记录。值类型使用default(type),引用类型使用new;
GetRecords
返回IEnumerable类型;
// By type
var records = csv.GetRecords<MyClass>();
//下面这种返回的是IEmuerable<object>
//所以需要在使用的时候as一下
var records = csv.GetRecords( typeof( MyClass ) );
// Dynamic
//动态类型对象没有智能提示
var records = csv.GetRecords<dynamic>();
// Using anonymous type for the class definition
//下面是原来的代码,其实这个匿名类型有问题,正确的结果如下
//var anony=new {Id=0,Name="",MyClass=new MyClass()};
var anonymousTypeDefinition =
{
Id = default( int ),
Name = string.Empty,
MyClass = new MyClass()
};
var records = csv.GetRecords( anonymousTypeDefinition );
迭代记录
可以通过一个可以重复使用的类的实例来迭代记录。每次迭代都会hydrate所提供的记录,但是只有被映射的成员。如果你提供了一个没有映射成员的映射,成员将不会hydrate当前行的数据(如果类中有没有和csv文件对应的属性,那么就会抛出异常)。所以要小心,投射的时候你调用的任何方法,会强制IEnumerable的评估,比如ToList(),最后你将会得到一个所有记录都是来自hydratec csv文件中最后一个记录相同记录集合。
原文用的是hydrate,本意是水合,我不清楚这里的意思是不是指将简单字符串包装成对象
var record = new MyClass();
var records = csv.EnumerateRecords( record );
//下面的records如果使用tolist()的方法,就会得到相同的最后一个记录。
foreach( var r in records )
{
// r is the same instance as record.
}
读取记录
为了获得单个记录甚至字段,你需要在记录当中通过Read方法进行迭代。Read方法会将reader移动到下一条记录,在你实际读取任何记录前,比如先调用Read方法。在GetRecords方法中,Read会被自动调用。
Read
移动reader到下一个记录;
csv.Read();
ReadAsync
异步版本,当TextReader是来自网络或者非常慢的时候会是个好主意。
await csv.ReadAsync();
ReadHeader
csv文件中的header是另外一个记录,有特殊含义,如果文件有一个header记录的话,你需要再第一次读取的时候先读取header,之后开始循环读取记录,这样就可以读取不同行上的header,甚至各种header。
csv.Read();
csv.ReadHeader();
while( csv.Read() )
{
var record = csv.GetRecord<MyClass>();
}
获取一个单独的记录
有时候你可能会想自己循环访问记录,你可以获得一个单独的记录,就像获得一些记录一样
GetRecord
// Don't forget to read the data before getting it.
csv.Read();
// By type
var record = csv.GetRecord<MyClass>();
var record = csv.GetRecord( typeof( MyClass ) );
// Dynamic
var record = csv.GetRecord<dynamic>();
// Using anonymous type for the class definition
//这里和上面有同样的问题
var anonymousTypeDefinition =
{
Id = default( int ),
Name = string.Empty,
MyClass = new MyClass()
};
var record = csv.GetRecord( anonymousTypeDefinition );
获取字段
如果你需要更细度的获取记录,你可以尝试获取单独的字段;
Indexer
如果你需要用indexer来获取位置和名称,将会返回这个字段的字符串值;
// Don't forget to read the data before getting it.
csv.Read();
// By position
var field = csv[0];
// By header name
var field = csv["HeaderName"];
GetField
可以把字段转换为特定类型
// Don't forget to read the data before getting it.
csv.Read();
// Gets field by position returning string
var field = csv.GetField( 0 );
// Gets field by position returning int
var field = csv.GetField<int>( 0 );
// Gets field by header name returning bool
var field = csv.GetField<bool>( "IsTrue" );
// Gets field by header name returning object
var field = csv.GetField( typeof( bool ), "IsTrue" );
TryGetField
如果数据不是确定的,有时候可能无法转换,所以需要使用TryGetField。
// Don't forget to read the data before getting it.
csv.Read();
var success = csv.TryGetField<int>( 0, out string field );
错误格式字段的处理
如果字段的格式错误,意味着它不是标准的RFC4180.RFC4180.如果使用一些修正策略的话还是可以读取的,通常来说,当一个格式错误的文件用Excel打开的时候会自动恢复好。
\r or \n is used instead of \r\n
Both \r and \n are handled as a line ending, just like \r\n.
No \r\n at the end of the file
The last row and field is read as if there was a \r\n.
Escaped field has space before first quote.
The field is treated as a non escaped field.
, "field", -> ][ "field"][
Escaped field has characters after second quote.
Characters after second quote aren't modified.
,"field" , -> ][field ][
,"field" "s, -> ][field "s][
,"field "" s", -> ][field " s"][
Escaped field has no ending quote.
The field will go to the end of the file.
a,b,"c\r\nd,e,f\r\n -> [a][b][c\r\nd,e,f\r\n]
读取上下文
读取的时候,所有系统中信息会包含在一个上下文对象当中,如果你因为某种原因需要得到原始的系统信息,可以从它里面获取。当一个异常被抛出的时候,上下文会被包含在异常当中,你可以检查当前reader的状态;
CsvHelper文档-2读的更多相关文章
- CsvHelper文档-3写
CsvHelper文档-3写 不用做任何设置,默认的情况下,csvhelper就可以很好的工作了.如果你的类的属性名称和csv的header名称匹配,那么可以按照下面的例子写入: var record ...
- CsvHelper文档-6类型转换
CsvHelper文档-6类型转换 CsvHelper使用类型转换器来转换string到对象,或者对象到string: ITypeConverter 类型转换器的结构,必须实现: public int ...
- CsvHelper文档-5配置
CsvHelper文档-5配置 CsvHelper库被设计成快速且简单易用,但是有时候默认的是设置不符合要求,需要你自己改变一些东西.所以csvHelper内置了很多自定义设置选项来改变读写行为.特别 ...
- CsvHelper文档-4映射
CsvHelper文档-4映射 类映射 有时候你的类成员和csv的header不一定对应,有时候你的csv文件根本就没有header行,你需要特别制定一个成员的index,你不能依靠.net中默认的顺 ...
- CsvHelper文档-1前言
CsvHelper文档-1前言 英文文档链接地址:CsvHelper Document 开源项目地址:CsvHelper 翻译于2018-1-5,原本可能会随时更新: 每一段代码都是经过我实际测试的, ...
- Grails 1.2参考文档速读(10):Controller
转载:http://keyvalue.blog.51cto.com/1475446/303260 从本篇起,我们将开始进入Grails的Web层,首先让我们从Controller说起. G ...
- XML文档的读、写
代码: XmlDocument doc = new XmlDocument(); doc.Load("Books.xml"); //1.加载要读取的XML文件 //要想看到数据得先 ...
- [ unittest ] 文档粗读
参考: https://blog.csdn.net/ljl6158999/article/details/80994979 1.概念提出 unittest最初灵感来自于Junit,它有着和其他单元测试 ...
- [daily][troubleshoot][archlinux][wps][font] wps文档中的图内容无法显示中文
序 用linux作为工作生产环境的几个需要解决的问题之一是:文档协作,即如何兼容Micro$oft Office格式的文档. 我一般的工作方式是:在linux下创建一个win7的虚拟机,安装常用的wi ...
随机推荐
- Gradle Goodness: Set Java Compiler Encoding
If we want to set an explicit encoding for the Java compiler in Gradle we can use the options.encodi ...
- 点击HTML页面问号出现提示框
本demo的功能:点击页面按钮在其边缘出现提示信息,点击页面任何一处则消失. 如下图: 1.所需插件: jquery插件: layer插件: 2.HTML内容: ==注意==: class=" ...
- 算法是什么(二)手写个链表(java)
算法是什么(二)手写个链表(java) liuyuhang原创,未经允许禁止转载 目录 算法是什么(〇) 很多语言的API中都提供了链表实现,或者扩展库中实现了链表. 但是更多的情况下,Map(或 ...
- acm--1004
问题描述 再次比赛时间!看到气球在四周漂浮,多么兴奋.但要告诉你一个秘密,评委最喜欢的时间是猜测最流行的问题.比赛结束后,他们会统计每种颜色的气球并找出结果. 今年,他们决定离开这个可爱的工作给你. ...
- 日期格式操作,在oracle和mysql中的实现
oracle add_months(日期格式值 , 整数n) 当整数n=12时,代表一年,向后推迟一年,若n=-12代表回退一年 如 to_char(add_months(to_date('2018 ...
- PHP中call user func()和call_user_func_array()调用自定义函数小结
call_user_func() 和 call_user_func_array(),通过传入字符串函数,可以调用自定义函数,并且支持引用,都允许用户调用自定义函数并传入一定的参数: 1.mixed c ...
- java instanceof 的理解
简单来说,java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法 ...
- Grep/find查找文件
1. 查找secret 函数所在的文件位置grep -rn secret * grep -rn "secret" * 2. find 查找当前目录下,比while2 时间新并且名字 ...
- Java 反射 (Class、ClassLoader、Constructor、Method、Field)
反射是Java中一个非常重要.非常强大的机制.曾看到一句话“反射是框架的灵魂”,初学时不懂,等到学完框架之后才慢慢理解其意. 什么是反射?我们先通过几个类和示例来初步体会一下反射. 一.ClassLo ...
- linux 网络编程 2---(TCP编程)
流程 服务器:server 创建套接字 socket( ) 填充服务器网络信息结构体 sockaddr_in 将套接字与服务器网络信息结构体绑定 bind( ) 将套接字设置为被动监听状态 liste ...