我是使用CsvHelperAPI 撰寫 CSV 檔案的新手。我已閱讀入門幫助主題。
我需要創建一個只定義了標題的空 CSV 檔案。這樣用戶就可以從此模板檔案開始并填充資料。
我知道如何手動創建文本檔案并自己手動完成。但是,由于我的課程具有讀取 CSV 的屬性,我想知道是否可以利用它來做相反的事情?
我在那里看到了一個例子,WriteHeader所以我想出了:
public void CreateEmptyHistoryFile(string path)
{
using (var writer = new StreamWriter(path))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteHeader<GenericHistory>();
}
}
但是如果可以將這兩個屬性都添加到我的屬性中,我找不到它的檔案:
[Index(1)]
[Name(“xxx”)]
Public string Yyy …
鏈接的文章說:
還記得我們如何不能依賴 .NET 中的屬性順序嗎?如果我們正在撰寫一個有標題的類,那沒關系,只要我們稍后使用標題讀取即可。如果我們想在 CSV 檔案中定位標題,我們需要指定一個索引來保證它的順序。建議在寫入時始終設定索引。
- 當我使用名稱屬性閱讀時。
- 當我撰寫帶有標題的空檔案時,我邏輯上希望按順序呈現它們(只是為了清楚起見)。
說得通?我們可以混合使用這兩個屬性嗎?
更新
我想知道那個關于屬性順序的建議是否過時了?
我剛剛運行了我的代碼,輸出按寫入順序排列(我沒有Index添加任何屬性)。
更新
我的班級有 82 個屬性,我嘗試為Index每個屬性添加一個屬性。當我嘗試閱讀時,我遇到了一個例外:
<LogEntry Date="2022-01-22 18:38:03" Severity="Exception" Source="MSAToolsLibrary.Importer.Importer.ImportHistoryFromGeneric" ThreadId="1">
<Exception Type="CsvHelper.TypeConversion.TypeConverterException" Source="CsvHelper.TypeConversion.DefaultTypeConverter.ConvertFromString">
<Message>The conversion cannot be performed.
Text: 'Andrew Truckle'
MemberType: System.Int32
TypeConverter: 'CsvHelper.TypeConversion.Int32Converter'
IReader state:
ColumnCount: 0
CurrentIndex: 4
HeaderRecord:
["Week","MidweekMeeting","WeekendMeeting","NumClasses","Host","Cohost","Chairman","AuxCounsellor1","AuxCounsellor2","PrayerOpen","Treasures_Name","Treasures_Theme","Treasures_Method","Gems_Name","Teaching","Teaching_Class1_Name","Teaching_Class2_Name","Teaching_Class3_Name","BibleReading_Study","StudentItem1_Study","StudentItem2_Study","StudentItem3_Study","StudentItem4_Study","StudentItem1_Description","StudentItem2_Description","StudentItem3_Description","StudentItem4_Description","BibleReading_Class1_Name","BibleReading_Class2_Name","BibleReading_Class3_Name","StudentItem1_Class1_Name","StudentItem1_Class1_Assistant","StudentItem2_Class1_Name","StudentItem2_Class1_Assistant","StudentItem3_Class1_Name","StudentItem3_Class1_Assistant","StudentItem4_Class1_Name","StudentItem4_Class1_Assistant","StudentItem1_Class2_Name","StudentItem1_Class2_Assistant","StudentItem2_Class2_Name","StudentItem2_Class2_Assistant","StudentItem3_Class2_Name","StudentItem3_Class2_Assistant","StudentItem4_Class2_Name","StudentItem4_Class2_Assistant","StudentItem1_Class3_Name","StudentItem1_Class3_Assistant","StudentItem2_Class3_Name","StudentItem2_Class3_Assistant","StudentItem3_Class3_Name","StudentItem3_Class3_Assistant","StudentItem4_Class3_Name","StudentItem4_Class3_Assistant","Living1_Name","Living1_Theme","Living1_Method","Living2_Name","Living2_Theme","Living2_Method","Living3_Name","Living3_Theme","Living3_Method","CBS_Conductor","CBS_Reader","PrayerClose","Weekend_Host","Weekend_Cohost","Weekend_Chairman","Weekend_PrayerOpen","Weekend_PT_Speaker","Weekend_PT_Theme","Weekend_PT_Number","Weekend_PT_Hospitality","Weekend_PT_Interpreter","Weekend_AT1_Name","Weekend_AT2_Name","Weekend_WT_Conductor","Weekend_WT_Reader","Weekend_WT_BibleVersesReader","Weekend_PrayerClose","Weekend_Misc"]
IParser state:
ByteCount: 0
CharCount: 2289
Row: 2
RawRow: 2
Count: 82
RawRecord:
27/01/2020,Y,Y,1,...
</Message>
<StackTrace> at CsvHelper.TypeConversion.DefaultTypeConverter.ConvertFromString(String text, IReaderRow row, MemberMapData memberMapData)
at CsvHelper.TypeConversion.Int32Converter.ConvertFromString(String text, IReaderRow row, MemberMapData memberMapData)
at lambda_method(Closure )
at CsvHelper.Expressions.RecordCreator.Create[T]()
at CsvHelper.CsvReader.<GetRecords>d__87`1.MoveNext()
at MSAToolsLibrary.Importer.Importer.ImportHistoryFromGeneric()</StackTrace>
</Exception>
</LogEntry>
出于隱私原因,我已洗掉資料中的姓名。我注意到它參考當前索引 4 并執行整數轉換。如您所見,該值為1。在閱讀課上:
[Index(4)]
public int NumClasses { get => HistoryWeek.NumClasses; set => HistoryWeek.NumClasses = value; }
正如我所說,如果我洗掉所有[Index(..)]我的閱讀代碼仍然有效。但是,如果我重新引入所有索引值,則會失敗。
uj5u.com熱心網友回復:
我通常發現它的順序與您的類中宣告的屬性的順序相同。但是,如果您想確定它們按特定順序排列,我會同時使用它們。
Type.GetProperties 方法
該
GetProperties方法不按特定順序回傳屬性,例如字母順序或宣告順序。您的代碼不得依賴于回傳屬性的順序,因為該順序會有所不同。
你可以試試這個例子,看看Name和Index屬性在使用CsvWriter.
void Main()
{
using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
{
csv.WriteHeader<Foo>();
}
}
public class Foo
{
[Name("Identity")]
[Index(1)]
public int Id { get; set; }
[Name("FirstName")]
[Index(0)]
public string Name { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419187.html
標籤:
上一篇:DataTableC#中的驗證
