CsvHelper 是讀寫 CSV 檔案的一個 .NET 函式庫。可以透過 Visual Studio 的套件管理器下載 CsvHelper。自動映射定義:沒有提供映射檔案的情況下,預設為自動映射,自動映射會依序依序映射到類別的屬性中去。
GitHub 位址
讀取
讀取所有的記錄
1 2 | var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>();
|
登入後複製
如果想要自訂映射關係,可以看下面映射一節。
由於 records 是個 IEnumerable 對象,因此僅當訪問的時候才會返回一個記錄,訪問一次就會返回一個記錄。如果想要想列表那樣訪問,可以作如下處理:
1 2 | var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>().ToList();
|
登入後複製
手動讀取記錄
可以按行循環讀取每一行的資料
1 2 3 4 5 | var csv = new CsvReader( textReader );
while ( csv.Read() )
{
var record = csv.GetRecord<MyClass>();
}
|
登入後複製
讀取單獨的欄位
1 2 3 4 5 6 7 | 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
1 2 3 4 5 6 7 8 9 | var csv = new CsvReader( textReader );
while ( csv.Read() )
{
int intField;
if ( !csv.TryGetField( 0, out intField ) )
{
}
}
|
登入後複製
解析
想要每一行作為一個字串傳回可以使用CsvParser 。
1 2 3 4 5 6 7 8 9 | var parser = new CsvParser( textReader );
while ( true )
{
var row = parser.Read();
if ( row == null )
{
break ;
}
}
|
登入後複製
寫入
寫入所有記錄
1 2 | var csv = new CsvWriter( textWriter );
csv.WriteRecords( records );
|
登入後複製
1 2 3 4 5 | var csv = new CsvWriter( textWriter );
foreach ( var item in list )
{
csv.WriteRecord( item );
}
|
登入後複製
1 2 3 4 5 6 7 8 | var csv = new CsvWriter( textWriter );
foreach ( var item in list )
{
csv.WriteField( "a" );
csv.WriteField( 2 );
csv.WriteField( true );
csv.NextRecord();
}
|
登入後複製
映射
#自動映射
#沒有提供映射檔案的情況下,默認為自動映射,自動映射會依序依序映射到類別的屬性中去。如果屬性是自訂類,那麼會繼續依序依照這個自訂類別的屬性進行填入。如果出現了循環引用,那麼自動映射會停止。
手動映射
如果 CSV 檔案和自訂的類別並不是完全的匹配,那麼可以定義一個匹配類別來處理。
1 2 3 4 5 6 7 8 | public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id );
Map( m = > m.Name );
}
}
|
登入後複製
本文由 tangyikejun 翻譯
引用映射
#如果屬性是一個自定義類,對應於CSV文件的多個列,那麼可以使用引用映射。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 );
}
}
|
登入後複製
下標指定
可以透過列下標指定映射
1 2 3 4 5 6 7 8 | public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id ).Index( 0 );
Map( m => m.Name ).Index( 1 );
}
}
|
登入後複製
列名指定
也可以透過列名指定映射,這要求csv檔案有一個頭記錄,也就是說第一行記錄列名
1 2 3 4 5 6 7 8 | public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id ).Name( "The Id Column" );
Map( m => m.Name ).Name( "The Name Column" );
}
}
|
登入後複製
同名處理
1 2 3 4 5 6 7 8 | public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.FirstName ).Name( "Name" ).NameIndex( 0 );
Map( m => m.LastName ).Name( "Name" ).NameIndex( 1 );
}
}
|
登入後複製
預設值
1 2 3 4 5 6 7 8 | 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" );
}
}
|
登入後複製
類型轉換
1 2 3 4 5 6 7 | public sealed class MyClassMap : CsvClassMap<MyClass>
{
public MyClassMap()
{
Map( m => m.Id ).Index( 0 ).TypeConverter<MyIdConverter>();
}
}
|
登入後複製
可選型別轉換
預設的轉換器會處理大部分的型別轉換,但是有時候我們可能需要做一些小的改變,這個時候可以嘗試是用可選型別轉換。
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 ) );
Map( m => m.Names ).ConvertUsing( row => new List<string>{ row.GetField<string>( "Name" ) } );
Map( m => m.Anything ).ConvertUsing( row =>
{
} );
}
}
|
登入後複製
運行時映射
#可以在運行時建立映射。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var customerMap = new DefaultCsvClassMap();
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 翻譯
配置
允許註解
1 2 | csv.Configuration.AllowComments = false;
|
登入後複製
自動對映
1 | var generatedMap = csv.Configuration.AutoMap<MyClass>();
|
登入後複製
快取
#TextReader或TextWriter 中讀寫的快取
1 2 | csv.Configuration.BufferSize = 2048;
|
登入後複製
註解
被註解掉的那行不會被載入進來
1 2 | csv.Configuration.Comment = '#';
|
登入後複製
Byte 計數
#記錄目前讀取了多少Byte 了,需要設定Configuration.Encoding 與CSV 檔案一致。這個設定會影響解析的速度。
1 2 | csv.Configuration.CountBytes = false;
|
登入後複製
Culture 訊息
1 2 | csv.Configuration.CultureInfo = CultureInfo.CurrentCulture;
|
登入後複製
分割符
1 2 | csv.Configuration.Delimiter = "," ;
|
登入後複製
列數變更
如果開啟,發現列數變更會拋出CsvBadDataException
1 2 | csv.Configuration.DetectColumnCountChanges = false;
|
登入後複製
編碼
1 2 | csv.Configuration.Encoding = Encoding.UTF8;
|
登入後複製
是否有頭記錄
1 2 | csv.Configuration.HasHeaderRecord = true;
|
登入後複製
忽略列名空格
是否忽略列名中的空格
1 2 | csv.Configuration.IgnoreHeaderWhiteSpace = false;
|
登入後複製
忽略私有存取
讀寫的時候是否忽略私有存取器
1 2 | csv.Configuration.IgnorePrivateAccessor = false;
|
登入後複製
忽略讀取異常
讀取發生異常後仍繼續讀取
1 2 | csv.Configuration.IgnoreReadingExceptions = false;
|
登入後複製
忽略引號
不把引號當作轉義符
1 2 | csv.Configuration.IgnoreQuotes = false;
|
登入後複製
列名是否大小寫敏感
1 2 | csv.Configuration.IsHeaderCaseSensitive = true;
|
登入後複製
映射存取
可以對自訂的類別對映進行存取
1 | var myMap = csv.Configuration.Maps[typeof( MyClass )];
|
登入後複製
屬性綁定標記
用來尋找自訂類別的屬性
1 2 | csv.Configuration.PropertyBindingFlags = BindingFlags.Public | BindingFlags.Instance;
|
登入後複製
本文由tang yi ke jun 翻譯
Quote
#定義用來轉義包含分隔符,括號或行尾的轉義符
1 2 | csv.Configuration.Quote = '"';
|
登入後複製
所有欄位加引號
寫入csv的時候是否對所有欄位加引號。 QuoteAllFields 和 QuoteNoFields 不能同時為 true 。
1 2 | csv.Configuration.QuoteAllFields = false;
|
登入後複製
所有欄位不加引號
QuoteAllFields 和 QuoteNoFields 不能同時為 true 。
1 2 | csv.Configuration.QuoteNoFields = false;
|
登入後複製
讀取異常的回呼
1 2 3 4 | csv.Configuration.ReadingExceptionCallback = ( ex, row ) =>
{
};
|
登入後複製
註冊類別映射
#使用了類別映射的話,需要進行註冊才會實際使用。
1 2 | csv.Configuration.RegisterClassMap<MyClassMap>();
csv.Configuration.RegisterClassMap<AnotherClassMap>();
|
登入後複製
跳過空白記錄
如果所有欄位都是空的,就會被認為是空白欄位
1 2 | csv.Configuration.SkipEmptyRecords = false;
|
登入後複製
Trim 欄位
把欄位內容收尾的空白字元刪除。
1 2 | csv.Configuration.TrimFields = false;
|
登入後複製
Trim 列名
1 2 | csv.Configuration.TrimHeaders = false;
|
登入後複製
解綁定類別映射
1 2 3 4 | csv.Configuration.UnregisterClassMap<MyClassMap>();
csv.Configuration.UnregisterClassMap();
|
登入後複製
空白欄位是否拋出例外
1 2 | csv.Configuration.WillThrowOnMissingField = true;
|
登入後複製
類型轉換
#類型轉換是CsvHelper 把字串轉換為.NET 類型(以及反過來)的方法。
其他
查看異常訊息
1 2 3 4 5 6 7 | Exception.Data[ "CsvHelper" ]
|
登入後複製
DataReader 與DataTable
DataReader 物件寫入到CSV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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
1 2 3 4 5 6 7 8 9 | 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中文文件
以上是技術解答CSV 文件的一個 .NET 函式庫:CsvHelper 中文文檔的詳細內容。更多資訊請關注PHP中文網其他相關文章!