在此先感謝,這里的 C# newb 有一些問題。
我每天提供的這個 CSV 檔案很大,而且沒有標題。我只需要這個檔案中的某些專案。
這是我到目前為止的代碼。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var reader = new StreamReader(iFile.FileName))
using (var csv = new CsvReader(reader, config))
{
var records = new List<BQFile>();
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
var record = new BQFile()
{
SNumber = csv.GetField<string>("SNumber"),
FOBPoint = csv.GetField<string>("FOBPoint")
};
}
由于這個 CSV 檔案有 150 多個欄位,我不明白的是如何獲取正確的資料。例如,如果 SNumber 是第 46 列,則 FOBPoint 是第 123 列。我發現 CSVHelper 檔案對我來說有點局限。
任何幫助表示贊賞。
uj5u.com熱心網友回復:
由于這個 CSV 檔案有 150 多個欄位,我不明白的是如何獲取正確的資料
按索引,因為沒有標頭
[Index(NNN)]在您的 BQFile 中,使用其中 N 是列號(從 0 開始)的屬性來裝飾屬性。在命名空間IndexAttribute中找到CsvHelper.Configuration.Attributes- 我提到這一點是因為 Entity Framework 也有一個 Index 屬性;確保使用正確的
pubic class BQFile{
[Index(46)]
public string SNumber { get; set;}
...
}
然后做:
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var reader = new StreamReader(iFile.FileName))
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<BQFile>();
...
records是檔案流頂部的一個列舉(通過 CSVHelper,它在記錄程序中讀取記錄并創建 BQFile 的實體)。您只能列舉一次,然后在您完成列舉后,檔案流將在最后 - 如果您想重新讀取檔案,您必須尋找流或更新reader. 此外,僅在您列舉時讀取檔案(以塊的形式,逐步) 。如果您回傳records某處,因此您退出using并因此處置閱讀器,當您嘗試開始閱讀時會出現錯誤records(因為它已被處置)
要使用records,您可以foreach隨時處理獲得的物件:
foreach(BQFile bqf in records){
//do stuff with each BQFile here
}
或者如果你想把它全部加載到記憶體中,你可以做類似的事情ToList(),這樣你最終會在一個串列中得到一堆 BQFile,然后你可以例如隨機訪問它們,一遍又一遍地閱讀它們等等。
var bqfs = records.ToList();
ps; 我不知道,當您說“它是第 46 列”時,它是從 1 還是從 0 計數的。您可能需要調整 46。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413678.html
標籤:
上一篇:如何過濾一組字典,以便我可以根據*另一個*鍵是否滿足特定條件從一個鍵中提取值?
下一篇:聚合特定檔案夾的未知csv檔案
