簡體   English   中英

CSVHelper C#的CSV文件空白字段錯誤

[英]CSV file Blank field error with CSVHelper C#

例如,我在使用 CSVHelper 讀取此文件時遇到問題,如何使用 ShouldSkipRecord 不接收異常? 我試圖讓我的所有地圖列都是可選的,但不起作用。

打印屏幕數據

班級:

public class WheelProsAccessoriesInventoryItem : WheelProsBaseInventoryItem
   {
       public override string PartNumber { get; set; }
       public override string PartDescription { get; set; } 
       public override string Brand { get; set; } 
       public string CapHardwareDescription { get; set; } 
       public string CapScrewQuantity { get; set; } 
       public string CapWrench { get; set; } 
       public string CapStyleDescription { get; set; } 
       public string ImageURL { get; set; } 
       public override string TotalQOH { get; set; } 
       public override string Msrp { get; set; } 
       public override string Map { get; set; } 
       public override string RunDate { get; set; } 
       public override string StockLa1 { get; set; } 
       public override string num1015 { get; set; } 
       public override string num1019 { get; set; } 
       public override string num1022 { get; set; } 
       public override string num1028 { get; set; } 
       public override string StockLa2 { get; set; } 
       public override string num1036 { get; set; } 
       public override string num1071 { get; set; } 
       public override string num1072 { get; set; } 
       public override string num1082 { get; set; }  
       public override string StockLa3 { get; set; } 
       public override string StockTX { get; set; } 
       public override string num1092 { get; set; } 
       public override string StockLangley { get; set; } 
       public override string StockToronto { get; set; } 
       public int LineNumber { get; set; }
   }

}

地圖:

public class WheelProsAccessoriesInventoryItemMap : ClassMap<WheelProsAccessoriesInventoryItem>
    {**

        public WheelProsAccessoriesInventoryItemMap()
        {
            Map(m => m.PartNumber).Name("PartNumber");
            Map(m => m.Brand).Name("Brand");
            Map(m => m.PartDescription).Name("PartDescription");


            Map(m => m.CapHardwareDescription).Name("CapHardwareDescription").Optional();
            Map(m => m.CapScrewQuantity).Name("CapScrewQuantity").Optional();
            Map(m => m.CapWrench).Name("CapWrench").Optional();
            Map(m => m.CapStyleDescription).Name("CapStyleDescription").Optional();

            Map(m => m.ImageURL).Name("ImageURL");
  
            Map(m => m.TotalQOH).Name("TotalQOH");
            Map(m => m.Msrp).Name("MSRP");
            Map(m => m.Map).Name("MAP");
            Map(m => m.RunDate).Name("RunDate"); 

            // StockWarehouses

            // 1011 – Stock LA1 Warehouse
            Map(m => m.StockLa1).Name("1011");

            // 1031 - Stock LA2 Riverside
            Map(m => m.StockLa2).Name("1031");

            // 1085 – Stock LA3 LA Warehouse Support
            Map(m => m.StockLa3).Name("1085");

            // 1086 - StockTX Dallas Warehouse
            Map(m => m.StockTX).Name("1086");

            // 4033 - Stock Langley/Vancouver
            Map(m => m.StockLangley).Name("4033");

            // 4035 - Stock Toronto
            Map(m => m.StockToronto).Name("4035");

            // 1088 - Stock US - Atlanta Logistics Center
            Map(m => m.num1088).Name("1088"); 

            Map(m => m.num1015).Name("1015").Optional();
            Map(m => m.num1019).Name("1019").Optional();
            Map(m => m.num1022).Name("1022").Optional();
            Map(m => m.num1028).Name("1028").Optional();
            Map(m => m.num1036).Name("1036").Optional();
            Map(m => m.num1071).Name("1071").Optional();
            Map(m => m.num1072).Name("1072").Optional();

            // Map(m => m.LineNumber).Convert(record => record.Row.Parser.Row);

        }

    }
}

讀取方法:

 public static IEnumerable<T> GetRecords<T, TMap>(string filename, bool hasFrenchChars = false)
    where T : class
    where TMap : ClassMap<T>
    {
        var errorRecsCollection = new List<string>();
        var malformedRow = false;

       

            using (var streamReader = new StreamReader(filename))
            {
                using (var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture))
                {

                    csvReader.Context.RegisterClassMap<TMap>();


                    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
                    {
                        Delimiter = ",",
                        HasHeaderRecord = true,
                        Encoding = hasFrenchChars ? Encoding.GetEncoding("ISO-8859-1") : Encoding.UTF8,
                        IgnoreBlankLines = true,
              
                        MissingFieldFound = null,
                        
                        BadDataFound = context =>
                        {
                            malformedRow = true;

                            errorRecsCollection.Add(context.RawRecord);

                        }

                    };

                  //  var rowNumber = csvReader.Parser.Row;
                return csvReader.GetRecords<T>().ToList();


                }

            }
       
         
    }

我需要怎么做才能忽略文件? 我嘗試在下面添加此配置,但不起作用。

這就是我處理不良記錄的方式(同一方法中的所有代碼)

var isRecordBad = false;
csv.Configuration.BadDataFound = context =>
{
    isRecordBad = true;
    bad.Add(context.RawRecord);
};

var records = csv.GetRecords<dynamic>(); //You can still use your type and map, dynamic is sometimes just easier for complicated mappings

foreach (var record in records)
{
    var dictionary = record as IDictionary<string, object>;
    if (!isRecordBad)
    {
        //keep the data - add to list
    }
    isRecordBad = false;
}

如果您決定采用dynamic類型路線,您還可以編寫更少的代碼,並在生成WheelProsAccessoriesInventoryItem對象時檢查轉換后的dictionary中的鍵

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM