• CvsHelper 使用指南


    用于读取和写入CSV文件的.NET库。 非常快速,灵活和易于使用。 支持读写自定义类对象。

    入门

    要安装CsvHelper,请从包管理器控制台运行以下操作。

    Install-Package CsvHelper

    读取所有记录

    阅读所有记录很简单。 如果有一个的类结构的镜像CSV文件,可以将整个文件读入。

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

    如果要自定义CSV文件映射到自定义类对象的方式,可以使用映射。(后面将会介绍)

    返回的IEnumerable <T>将产生结果。 这意味着在实际访问数据之前不会返回结果。 因为整个文件将不会被加载到内存中,并且当您访问数据时,该文件将被读取。 如果您需要多次迭代记录(例如使用Count),则可以将所有内容加载到列表和数据的工作中。

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

    逐条阅读记录

    可以循环行并逐条读取它们。

    var csv = new CsvReader( textReader );
    while( csv.Read() )
    {
        var record = csv.GetRecord<MyClass>();
    }

    逐列阅读字段

    也可以逐项读取每个字段。

    var csv = new CsvReader( textReader );
    while( csv.Read() )
    {
        var intField = csv.GetField<int>( 0 );
        var stringField = csv.GetField<string>( 1 );
        var boolField = csv.GetField<bool>( "HeaderName" );
    }

    尝试得到字段

    如果你可能得到字段的类型有不一致的地方,你可以用trygetfield。

    var csv = new CsvReader( textReader );
    while( csv.Read() )
    {
        int intField;
        if( !csv.TryGetField( 0, out intField ) )
        {
            // Do something when it can't convert.
        }
    }

      

    读取一行(分析器)

    您还可以直接使用分析器而不使用读取器。分析器将为读取的每一行返回一个字符串数组,当它完成时将返回null。        

    var parser = new CsvParser( textReader );
    while( true )
    {
        var row = parser.Read();
        if( row == null )
        {
            break;
        }
    }            

    写所有记录

    如果你想有一个类结构镜像的CSV文件,你可以直接写整个文件。

    var csv = new CsvWriter( textWriter );
    csv.WriteRecords( records );

      

    逐条写记录

    您可以循环对象并逐条编写它们。

    var csv = new CsvWriter( textWriter );
    foreach( var item in list )
    {
        csv.WriteRecord( item );
    }

    逐列写字段

    也可以逐项写每个字段。

    var csv = new CsvWriter( textWriter );
    foreach( var item in list )
    {
        csv.WriteField( "a" );
        csv.WriteField( 2 );
        csv.WriteField( true );
        csv.NextRecord();
    }

     

    映射

    自动映射


    如果不提供映射文件,将使用自动映射。 自动映射将按照它们显示的顺序映射类中的属性。如果属性是一个自定义类,它会按照它们显示的顺序递归地的属性类映射。如果自动映射器命中循环引用,那么它将 停止映射.

    类的映射

    如果您的CSV文件与自定义类不匹配,您可以使用一个类映射来设置类如何映射到文件的列。您需要在配置中注册您的类映射。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public MyClassMap()
        {
            Map( m => m.Id );
            Map( m = > m.Name );
        }
    }

     

    引用地图

    引用地图用于将自定义类的属性,将其映射到几个CSV列。您可以嵌套参考图的许多层深,只要你喜欢。

    public sealed class PersonMap : CsvClassMap<Person>
    {
        public PersonMap()
        {
            Map( m => m.Id );
            Map( m => m.Name );
            References<AddressMap>( m => m.Address );
        }
    }
    
    public sealed class AddressMap : CsvClassMap<Address>
    {
        public AddressMap()
        {
            Map( m => m.Street );
            Map( m => m.City );
            Map( m => m.State );
            Map( m => m.Zip );
        }
    }

    指数


    当通过索引映射时,您指定要为该属性使用的CSV列的索引。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public MyClassMap()
        {
            Map( m => m.Id ).Index( 0 );
            Map( m => m.Name ).Index( 1 );
        }
    }

      

    列名


    按列名映射时,指定要为该属性使用的CSV列的名称。要工作,CSV文件必须有头记录。指定的名称必须与头记录的名称匹配。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public MyClassMap()
        {
            Map( m => m.Id ).Name( "The Id Column" );
            Map( m => m.Name ).Name( "The Name Column" );
        }
    }

      

    同名列索引

    有时CSV文件有多个名称相同的列。 发生这种情况时,可以使用NameIndex来指定您所指的列名。 NameIndex不是CSV文件中的列,而是同名列的索引。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public MyClassMap()
        {
            Map( m => m.FirstName ).Name( "Name" ).NameIndex( 0 );
            Map( m => m.LastName ).Name( "Name" ).NameIndex( 1 );
        }
    }

      

    默认

    如果字段为空,默认值用于设置要使用的默认值。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public override void MyClassMap()
        {
            Map( m => m.Id ).Index( 0 ).Default( -1 );
            Map( m => m.Name ).Index( 1 ).Default( "Unknown" );
        }
    }

      

    类型转换器


    如果CSV字段的值不能被自动转换为属性的类型,你可以指定一个自定义csvhelper.typeconversion.itypeconverter用来转换。有关如何创建自定义类型请看类型转换器的文档。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public MyClassMap()
        {
            Map( m => m.Id ).Index( 0 ).TypeConverter<MyIdConverter>();
        }
    }

      

    类型转换器的设置


    默认内置转换器将处理大多数类型转换的情况,但有时也有一些小的变化,你想做,但不想创建一个完整的新型转换器,只是一个int(例如)分析不同。您可以指定一些类型转换器选项来处理这些情况。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public MyClassMap()
        {
            Map( m => m.Description ).Index( 0 ).TypeConverterOption( CultureInfo.InvariantCulture );
            Map( m => m.TimeStamp ).Index( 1 ).TypeConverterOption( DateTimeStyles.AdjustToUniversal );
            Map( m => m.Cost ).Index( 2 ).TypeConverterOption( NumberStyles.Currency );
            Map( m => m.CurrencyFormat ).Index( 3 ).TypeConverterOption( "C" );
            Map( m => m.BooleanValue ).Index( 4 ).TypeConverterOption( true, "sure" ).TypeConverterOption( false, "nope" );
        }
    }

    使用转换
    当一切都失败了,你可以用convertusing。convertusing允许您编写自定义代码内联转把行转换成一个单一的属性值。

    public sealed class MyClassMap : CsvClassMap<MyClass>
    {
        public MyClassMap()
        {
            // Constant value.
            Map( m => m.Constant ).ConvertUsing( row => 3 );
            // Aggregate of two rows.
            Map( m => m.Aggregate ).ConvertUsing( row => row.Get<int>( 0 ) + row.Get<int>( 1 ) );
            // Collection with a single value.
            Map( m => m.Names ).ConvertUsing( row => new List<string>{ row.Get<string>( "Name" ) } );
            // Just about anything.
            Map( m => m.Anything ).ConvertUsing( row =>
            {
                // You can do anything you want in a block.
                // Just make sure to return the same type as the property.
            } );
        }
    }

    运行时映射
    地图可以在运行时创建。事实上,自动地图功能动态。你可以看看下面的链接的一些启示:https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/Configuration/CsvClassMap.cs#L91另一个简单的例子如下所示:

    var customerMap = new DefaultCsvClassMap();
    
    // mapping holds the Property - csv column mapping 
    foreach( string key in mapping.Keys )
    {
        var columnName = mapping[key].ToString();
    
        if( !String.IsNullOrEmpty( columnName ) )
        {
            var propertyInfo = typeof( Customer ).GetType().GetProperty( key );
            var newMap = new CsvPropertyMap( propertyInfo );
            newMap.Name( columnName );
            customerMap.PropertyMaps.Add( newMap );
        }
    }
    
    csv.Configuration.RegisterClassMap(CustomerMap);
  • 相关阅读:
    jquery中$.get()提交和$.post()提交有区别吗?
    src = "security/afafsff/?ip=123.4.56.78&id=45",请写一段代码用正则匹配出ip
    python如何捕获异常
    平衡点问题
    支配点问题:
    python程序中文输出问题怎么解决? 用encode和decode
    介绍一下Python中webbrowser的用法?
    XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
    垃圾回收的优点和原理。并考虑2种回收机制。
    设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
  • 原文地址:https://www.cnblogs.com/coky/p/6880834.html
Copyright © 2020-2023  润新知