CsvHelper文档-2读

这个库默认不需要做任何设置就可以很容易的使用它。如果你的类属性名称直接匹配csv的标题名称,那么可以按照下面的实例来用:

(以下所有的代码都需要引用using csvhelper命名空间)

  1. var csv=new CsvReader(textReader);
  2. var records=csv.GetRecords<MyClass>();

读取全部记录

最常用的场景是使用GetRecords方法。你可以指定任何你要想要返回的对象类型,然后它会返回一个能够让你迭代IEnumerable类型结果。也就是说,每次迭代的时候,内存当中每次都会是一个值,而不是一下子把整个文件全部读进来。在你实际开始迭代读取之前,数据并不会都被拉进来。

如果你想要是使用一个匿名对象类型作为你的记录,你可以提供一个类型定义来获得记录。值类型使用default(type),引用类型使用new

GetRecords

返回IEnumerable类型;

  1. // By type
  2. var records = csv.GetRecords<MyClass>();
  3. //下面这种返回的是IEmuerable<object>
  4. //所以需要在使用的时候as一下
  5. var records = csv.GetRecords( typeof( MyClass ) );
  6. // Dynamic
  7. //动态类型对象没有智能提示
  8. var records = csv.GetRecords<dynamic>();
  9. // Using anonymous type for the class definition
  10. //下面是原来的代码,其实这个匿名类型有问题,正确的结果如下
  11. //var anony=new {Id=0,Name="",MyClass=new MyClass()};
  12. var anonymousTypeDefinition =
  13. {
  14. Id = default( int ),
  15. Name = string.Empty,
  16. MyClass = new MyClass()
  17. };
  18. var records = csv.GetRecords( anonymousTypeDefinition );

迭代记录

可以通过一个可以重复使用的类的实例来迭代记录。每次迭代都会hydrate所提供的记录,但是只有被映射的成员。如果你提供了一个没有映射成员的映射,成员将不会hydrate当前行的数据(如果类中有没有和csv文件对应的属性,那么就会抛出异常)。所以要小心,投射的时候你调用的任何方法,会强制IEnumerable的评估,比如ToList(),最后你将会得到一个所有记录都是来自hydratec csv文件中最后一个记录相同记录集合。

原文用的是hydrate,本意是水合,我不清楚这里的意思是不是指将简单字符串包装成对象

  1. var record = new MyClass();
  2. var records = csv.EnumerateRecords( record );
  3. //下面的records如果使用tolist()的方法,就会得到相同的最后一个记录。
  4. foreach( var r in records )
  5. {
  6. // r is the same instance as record.
  7. }

读取记录

为了获得单个记录甚至字段,你需要在记录当中通过Read方法进行迭代。Read方法会将reader移动到下一条记录,在你实际读取任何记录前,比如先调用Read方法。在GetRecords方法中,Read会被自动调用。

Read

移动reader到下一个记录;

  1. csv.Read();

ReadAsync

异步版本,当TextReader是来自网络或者非常慢的时候会是个好主意。

  1. await csv.ReadAsync();

ReadHeader

csv文件中的header是另外一个记录,有特殊含义,如果文件有一个header记录的话,你需要再第一次读取的时候先读取header,之后开始循环读取记录,这样就可以读取不同行上的header,甚至各种header。

  1. csv.Read();
  2. csv.ReadHeader();
  3. while( csv.Read() )
  4. {
  5. var record = csv.GetRecord<MyClass>();
  6. }

获取一个单独的记录

有时候你可能会想自己循环访问记录,你可以获得一个单独的记录,就像获得一些记录一样

GetRecord

  1. // Don't forget to read the data before getting it.
  2. csv.Read();
  3. // By type
  4. var record = csv.GetRecord<MyClass>();
  5. var record = csv.GetRecord( typeof( MyClass ) );
  6. // Dynamic
  7. var record = csv.GetRecord<dynamic>();
  8. // Using anonymous type for the class definition
  9. //这里和上面有同样的问题
  10. var anonymousTypeDefinition =
  11. {
  12. Id = default( int ),
  13. Name = string.Empty,
  14. MyClass = new MyClass()
  15. };
  16. var record = csv.GetRecord( anonymousTypeDefinition );

获取字段

如果你需要更细度的获取记录,你可以尝试获取单独的字段;

Indexer

如果你需要用indexer来获取位置和名称,将会返回这个字段的字符串值;

  1. // Don't forget to read the data before getting it.
  2. csv.Read();
  3. // By position
  4. var field = csv[0];
  5. // By header name
  6. var field = csv["HeaderName"];

GetField

可以把字段转换为特定类型

  1. // Don't forget to read the data before getting it.
  2. csv.Read();
  3. // Gets field by position returning string
  4. var field = csv.GetField( 0 );
  5. // Gets field by position returning int
  6. var field = csv.GetField<int>( 0 );
  7. // Gets field by header name returning bool
  8. var field = csv.GetField<bool>( "IsTrue" );
  9. // Gets field by header name returning object
  10. var field = csv.GetField( typeof( bool ), "IsTrue" );

TryGetField

如果数据不是确定的,有时候可能无法转换,所以需要使用TryGetField。

  1. // Don't forget to read the data before getting it.
  2. csv.Read();
  3. var success = csv.TryGetField<int>( 0, out string field );

错误格式字段的处理

如果字段的格式错误,意味着它不是标准的RFC4180.RFC4180.如果使用一些修正策略的话还是可以读取的,通常来说,当一个格式错误的文件用Excel打开的时候会自动恢复好。

  1. \r or \n is used instead of \r\n
  2. Both \r and \n are handled as a line ending, just like \r\n.
  3. No \r\n at the end of the file
  4. The last row and field is read as if there was a \r\n.
  5. Escaped field has space before first quote.
  6. The field is treated as a non escaped field.
  7. , "field", -> ][ "field"][
  8. Escaped field has characters after second quote.
  9. Characters after second quote aren't modified.
  10. ,"field" , -> ][field ][
  11. ,"field" "s, -> ][field "s][
  12. ,"field "" s", -> ][field " s"][
  13. Escaped field has no ending quote.
  14. The field will go to the end of the file.
  15. a,b,"c\r\nd,e,f\r\n -> [a][b][c\r\nd,e,f\r\n]

读取上下文

读取的时候,所有系统中信息会包含在一个上下文对象当中,如果你因为某种原因需要得到原始的系统信息,可以从它里面获取。当一个异常被抛出的时候,上下文会被包含在异常当中,你可以检查当前reader的状态;

CsvHelper文档-2读的更多相关文章

  1. CsvHelper文档-3写

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

  2. CsvHelper文档-6类型转换

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

  3. CsvHelper文档-5配置

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

  4. CsvHelper文档-4映射

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

  5. CsvHelper文档-1前言

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

  6. Grails 1.2参考文档速读(10):Controller

    转载:http://keyvalue.blog.51cto.com/1475446/303260       从本篇起,我们将开始进入Grails的Web层,首先让我们从Controller说起. G ...

  7. XML文档的读、写

    代码: XmlDocument doc = new XmlDocument(); doc.Load("Books.xml"); //1.加载要读取的XML文件 //要想看到数据得先 ...

  8. [ unittest ] 文档粗读

    参考: https://blog.csdn.net/ljl6158999/article/details/80994979 1.概念提出 unittest最初灵感来自于Junit,它有着和其他单元测试 ...

  9. [daily][troubleshoot][archlinux][wps][font] wps文档中的图内容无法显示中文

    序 用linux作为工作生产环境的几个需要解决的问题之一是:文档协作,即如何兼容Micro$oft Office格式的文档. 我一般的工作方式是:在linux下创建一个win7的虚拟机,安装常用的wi ...

随机推荐

  1. 工程命名为***&***出现的问题: LaunchScreen.xib: Line 20: EntityRef: expecting ';'

    今天新建一个项目命名为28 & 29. extern&static,  然后cmd + R运行,居然碰到了编译错误. 当时就奇怪了,怎么会这样呢?报错内容如下: 开始还以为新安装的Xc ...

  2. flume data to hdfs

    flume 开发梳理 flume 数据到hadoop conf/hdfsAgent.conf #配置sources.channels.sinks a1.sources=r1 a1.channels=c ...

  3. Notes 20180306 : 变量与常量

    1.1 变量与常量 我们在开发中会经常听到常量和变量,那么常量和变量指的又是什么呢?顾名思义,在程序执行过程中,其值不能被改变的量称为常量,其值能被改变的量称为变量.变量与常量的命名都必须使用合法的标 ...

  4. oracle 数据库密码生产同步模拟环境 ,随记常用命令

    1.查看当前open用户 select username,account_status,expiry_date,profile from dba_users; 2.查看目前的密码过期策略 select ...

  5. JSON.stringify()和JSON.parse()的区别

    JSON.stringify()此方法用于将一个对象解析成字符串并返回. JSON.parse()此方法刚好相反是将一个字符串对象解析成一个JSON对象.

  6. Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

    本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个 ...

  7. CI框架视图继承

    CI(CodeIgniter)框架 视图继承 这个代码不是我撸的 ... 当时在哪儿找的忘了 ... 如果有侵权什么的 ... 联系我删了 ... 需要去core里面创建一个MY_loader.php ...

  8. 《TCP/IP详解 卷1:协议》第3章 IP:网际协议

    3.1 引言 IP是TCP/IP协议族中最为核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输(见图1-4).许多刚开始接触TCP/IP的人对IP提供不可靠.无连接的数据报 ...

  9. burp实时获取token

    在一些web网站里 会加入token来限制用户的一些操作 如果用户的请求里面没有这个token  那么我们的一些操作就会很麻烦 现在 我来演示一下burp如何自动更新token 首先 需要dvwa  ...

  10. PTA基础编程题目集7-3逆序三位数

    7-3 逆序的三位数 (10 分) 程序每次读入一个正3位数,然后输出按位逆序的数字.注意:当输入的数字含有结尾的0时,输出不应带有前导的0.比如输入700,输出应该是7. 输入格式: 每个测试是一个 ...