技術解答CSV 檔案的一個 .NET 庫:CsvHelper 中文文檔

來源:互聯網
上載者:User
CsvHelper 是讀寫 CSV 檔案的一個 .NET 庫。可以通過 Visual Studio 的包管理器下載 CsvHelper。自動對應定義:沒有提供對應檔的情況下,預設為自動對應,自動對應會按順序依次映射到類的屬性中去。

GitHub 地址

讀取

讀取所有的記錄

var csv = new CsvReader( textReader );var records = csv.GetRecords<MyClass>(); // 把 CSV 記錄映射到 MyClass,返回的 records 是個 IEnumerable<T> 對象

如果想要自訂映射關係,可以看下面映射一節。
由於 records 是個 IEnumerable<T> 對象,因此僅當訪問的時候才會返回一個記錄,訪問一次就返回一個記錄。如果想要想列表那樣訪問,可以作如下處理:

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.    }}

解析

想要每一行作為一個字串返回可以使用 CsvParser 。

var parser = new CsvParser( textReader );while( true ){    var row = parser.Read(); // row 是個字串    if( row == null )    {        break;    }}

寫入

寫入所有記錄

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 );    }}
本文由 tangyikejun 翻譯

引用映射

如果屬性是一個自訂類,對應於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 );    }}

下標指定

可以通過列下標指定映射

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

列名指定

也可以通過列名指定映射,這要求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" );    }}

同名處理

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" );    }}

類型轉換

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

可選類型轉換

預設的轉換器會處理大部分的類型轉換,但是有時候我們可能需要做一些小的改變,這個時候可以嘗試是用可選類型轉換。

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

public sealed class MyClassMap : CsvClassMap<MyClass>{    public MyClassMap()    {        // 常數        Map( m => m.Constant ).ConvertUsing( row => 3 );        // 把兩列彙總在一起        Map( m => m.Aggregate ).ConvertUsing( row => row.GetField<int>( 0 ) + row.GetField<int>( 1 ) );        // Collection with a single value.        Map( m => m.Names ).ConvertUsing( row => new List<string>{ row.GetField<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.        } );    }}

運行時映射

可以在運行時建立映射。

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);
本文由 tangyikejun 翻譯

配置

允許注釋

// Default valuecsv.Configuration.AllowComments = false;

自動對應

var generatedMap = csv.Configuration.AutoMap<MyClass>();

緩衝

TextReader 或 TextWriter 中讀寫的緩衝

// Default valuecsv.Configuration.BufferSize = 2048;

注釋

被注釋掉的那行不會被載入進來

// Default valuecsv.Configuration.Comment = '#';

Byte 計數

記錄當前讀取了多少 Byte 了,需要設定 Configuration.Encoding 與 CSV 檔案一致。這個設定會影響解析的速度。

// Default valuecsv.Configuration.CountBytes = false;

Culture 資訊

// Default valuecsv.Configuration.CultureInfo = CultureInfo.CurrentCulture;

分割符

// Default valuecsv.Configuration.Delimiter = ",";

列數變化

如果開啟,發現列數變化會拋出 CsvBadDataException

// Default valuecsv.Configuration.DetectColumnCountChanges = false;

編碼

// Default valuecsv.Configuration.Encoding = Encoding.UTF8;

是否有頭記錄

// Default valuecsv.Configuration.HasHeaderRecord = true;

忽略列名空格

是否忽略列名中的空格

// Default valuecsv.Configuration.IgnoreHeaderWhiteSpace = false;

忽略私人訪問

讀寫的時候是否忽略私人訪問器

// Default valuecsv.Configuration.IgnorePrivateAccessor = false;

忽略讀取異常

讀取發生異常之後仍繼續讀取

// Default valuecsv.Configuration.IgnoreReadingExceptions = false;

忽略引號

不把引號作為轉義符

// Default valuecsv.Configuration.IgnoreQuotes = false;

列名是否大小寫敏感

// Default valuecsv.Configuration.IsHeaderCaseSensitive = true;

映射訪問

可以對自訂的類映射進行訪問

var myMap = csv.Configuration.Maps[typeof( MyClass )];

屬性綁定標記

用來尋找自訂類的屬性

// Default valuecsv.Configuration.PropertyBindingFlags = BindingFlags.Public | BindingFlags.Instance;
本文由 tang yi ke jun 翻譯

Quote

定義用來轉義包含分隔字元,括弧或者行尾的轉義符

// Default valuecsv.Configuration.Quote = '"';

所有欄位加引號

寫入csv的時候是否對所有欄位加引號。QuoteAllFields 和 QuoteNoFields 不能同時為 true 。

// Default valuecsv.Configuration.QuoteAllFields = false;

所有欄位不加引號

QuoteAllFields 和 QuoteNoFields 不能同時為 true 。

// Default valuecsv.Configuration.QuoteNoFields = false;

讀取異常的回調

csv.Configuration.ReadingExceptionCallback = ( ex, row ) =>{    // Log the exception and current row information.};

註冊類映射

使用了類映射的話,需要進行註冊才會被實際使用到。

csv.Configuration.RegisterClassMap<MyClassMap>();csv.Configuration.RegisterClassMap<AnotherClassMap>();

跳過空白記錄

如果所有欄位都是空的,就會被認為是空欄位

// Default valuecsv.Configuration.SkipEmptyRecords = false;

Trim 欄位

把欄位內容收尾的空白字元刪去。

// Default valuecsv.Configuration.TrimFields = false;

Trim 列名

// Default valuecsv.Configuration.TrimHeaders = false;

解除綁定類映射

// Unregister single map.csv.Configuration.UnregisterClassMap<MyClassMap>();// Unregister all class maps.csv.Configuration.UnregisterClassMap();

空欄位是否拋出異常

// Default valuecsv.Configuration.WillThrowOnMissingField = true;

類型轉換

類型轉換是 CsvHelper 把字串轉換為 .NET 類型(以及反過來)的方法。

其他

查看異常資訊

Exception.Data["CsvHelper"]// Row: '3' (1 based)// Type: 'CsvHelper.Tests.CsvReaderTests+TestBoolean'// Field Index: '0' (0 based)// Field Name: 'BoolColumn'// Field Value: 'two'

DataReader 與 DataTable

DataReader 對象寫入到 CSV

var hasHeaderBeenWritten = false;while( dataReader.Read() ){    if( !hasHeaderBeenWritten )    {        for( var i = 0; i < dataReader.FieldCount; i++ )        {            csv.WriteField( dataReader.GetName( i ) );        }        csv.NextRecord();        hasHeaderBeenWritten = true;    }    for( var i = 0; i < dataReader.FieldCount; i++ )    {        csv.WriteField( dataReader[i] );    }    csv.NextRecord();}

DataTable 對象寫入到 CSV

using( var dt = new DataTable() ){    dt.Load( dataReader );    foreach( DataColumn column in dt.Columns )    {        csv.WriteField( column.ColumnName );    }    csv.NextRecord();    foreach( DataRow row in dt.Rows )    {        for( var i = 0; i < dt.Columns.Count; i++ )        {            csv.WriteField( row[i] );        }        csv.NextRecord();    }}

CSV 轉 DataTable

while( csv.Read() ){    var row = dt.NewRow();    foreach( DataColumn column in dt.Columns )    {        row[column.ColumnName] = csv.GetField( column.DataType, column.ColumnName );    }    dt.Rows.Add( row );}

相關文章:

.net CsvHelper 2.0

jQuery EasyUI API 中文文檔 - Documentation 文檔_jquery

相關視頻:

Ruby中文文檔

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.