CsvHelper文檔-3寫
不用做任何設置,默認的情況下,csvhelper就可以很好的工作了。如果你的類的屬性名稱和csv的header名稱匹配,那么可以按照下面的例子寫入:
var records = new List<MyClass> { ... };
var csv = new CsvWriter( textWriter );
csv.WriteRecords( records );
//對應的Stream必須flush一下,否則不會寫入
注入警告
當用外部程序打開一個csv文件的時候,字段的標識可能會包含可執行公式會導致脆弱性。因此,如果一個字段是以 = @ + - 開始,字段將會被設置一個\t,如果字段被引用,那么\t將會以”結束(這句話的意思是,在電子表格軟件中=開始的會被解釋為公式)
=one -> \t=one
"=one" -> "\t=one"
你可以在設置中關閉這個功能:
csv.Configuration.SanitizeForInjection = false;
寫入所有記錄
最常用的是WriteRecords方法,你可以傳遞給他一個IEnumerable類型的記錄,然后它會寫入所有的記錄;
WriteRecords
var records = new List<MyClass>
{
new MyClass { Id = 1, Name = "one" },
new MyClass { Id = 2, Name = "two" },
};
csv.WriteRecords( records );
// Dynamic
var records = new List<dynamic>();
dynamic record = new ExpandoObject();
record.Id = 1;
record.Name = "one";
records.Add( record );
csv.WriteRecords( records );
// Anonymous
var records = new List<object>
{
new { Id = 1, Name = "one" },
new { Id = 2, Name = "two" },
};
csv.WriteRecords( records );
//這里必須對csv進行關閉或者dispose,csv會自動關閉textwriter,從而將緩沖區的數據真實寫入文件
//要么就得調用對writer的flush處理
寫入一個單獨的記錄
有時候你會想要一個一個寫入每個記錄,每當結束幾行的寫入的時候,不要忘記調用NextRecord來flush數據和寫入行結尾。
WriteHeader
寫入Header記錄,你可以在任何行使用這個方法,可以寫入多個Header.
csv.WriteHeader<MyClass>();
csv.WriteHeader( Type type );
csv.NextRecord();
WriteRecord
寫入記錄
var record = new MyClass { Id = 1, Name = "one" };
csv.WriteRecord( record );
csv.NextRecord();
// Dynamic
dynamic record = new ExpandoObject();
record.Id = 1;
record.Name = "one";
csv.WriteRecord( record );
csv.NextRecord();
// Anonymous
var record = new { Id = 1, Name = "one" };
csv.WriteRecord( record );
csv.NextRecord();
寫入字段
可以單獨寫入每個字段
WriteField
寫入一個字段的類型,你可以使用你自己的ITypeConverter來處理類型到String的轉換,如果現有的converter沒有合適的類型。
// Write a string
csv.WriteField( "field" );
// Write a string passing in a value indicating
// if the field should be quoted. This will ignore
// any configuration and only quote based on the
// shouldQuote parameter passed in.
csv.WriteField( "field", true );
// Write any type
csv.WriteField( 1 );
// Write any type and use the given type converter
// to convert the type to a string.
csv.WriteField( value, myTypeConverter );
// Write any type and use the given type converter
// to convert the type to a string.
csv.WriteField<MyTypeConverter>( value );
// Write a field that has already been converted
// by a type converter. If the field is null, it
// won't get written.
csv.WriteConvertedField( "field" );
// Don't forget to forget to end the row.
csv.NextRecord();
WriteComment
這個方法將會使用Configuration.Comment中的Comment字符來寫入文本。
結束一行
當你結束寫入一行的時候,你需要flush一下字段,重新開始一個新行,Flushing和開始一個新行是分開的,所以你可以在沒有開始新行的時候就Flush,調用NextRecord就會自動為你Flush。
Flush
這個方法會序列化字段到TextReaderTextWriter。
csv.Flush();
FlushAsync
異步序列化字段到TextReaderTextWriter,如果TextReaderTextWriter連接的是網絡或者其他慢速地寫入,異步執行會是個好主意。
csv.FlushAsync();
NextRecord
結束當前記錄開始新的記錄,調用Flush,然后寫入新行。
csv.NextRecord();
NextRecordAsync
異步結束當前記錄開始新的記錄,調用FlushAsync,然后異步寫入新行。
csv.NextRecordAsync();
寫入上下文
和之前讀的部分相同,所以略。