zoukankan      html  css  js  c++  java
  • 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打开的时候会自动恢复好。

    
     or 
     is used instead of 
    
    Both 
     and 
     are handled as a line ending, just like 
    .
    No 
     at the end of the file
    The last row and field is read as if there was a 
    .
    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
    d,e,f
     -> [a][b][c
    d,e,f
    ]
    

    读取上下文

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

  • 相关阅读:
    Resharper进阶一
    脚本(js)控制页面输入
    IE图标消失 HTML文件图标变为未知图标的解决方法
    memcache_engine + memcachedb = 高性能分布式内存数据库
    sql 求差值
    MSN、QQ的网页链接代码
    IFrame语法:IFrame实例应用集
    Memcache协议
    Windows下的Memcache安装
    文本框 价格 保留两位小数 讨论
  • 原文地址:https://www.cnblogs.com/newlifechou/p/8206503.html
Copyright © 2011-2022 走看看