【问题标题】:validate column order during CSV file import在 CSV 文件导入期间验证列顺序
【发布时间】:2016-06-15 15:30:57
【问题描述】:

我的公司有客户线索的 CSV 文件,需要导入到我们的 CRM 中。我需要导入的 CSV 文件列按此顺序才能成功导入。在某些情况下,如果用户没有正确格式化列,可能会出现用户错误,并且 First Name 可能会排在第一位。为了防止以这种方式导入整个文件,我需要检查所有列是否按此顺序匹配:

  1. 公司名称
  2. 名字
  3. 姓氏
  4. 职位名称
  5. 电子邮件
  6. 街道地址
  7. 城市
  8. 状态
  9. 邮编
  10. 电话
  11. 手机
  12. 传真
  13. 网址

到目前为止,我没有正确验证公司名称是否排在第一位,而是将 CSV 中的 A 列保存为公司名称。我已经尝试了很多类似的事情,但没有运气。我很难找到编写代码背后的逻辑。 注意: 我所写的内容没有读取列标题,我确定这就是我的问题所在。

控制器:

         [HttpPost]
     public ActionResult LeadProcessImport(HttpPostedFileBase FileUpload)
     {
         DataTable dt = new DataTable();
         if (FileUpload == null)
         {
             TempData["Message"] = "";
             return View();
         }


         string ext = Path.GetExtension(FileUpload.FileName);
         if (FileUpload.ContentLength > 0)
         {

             string fileName = Path.GetFileName(FileUpload.FileName);
             string path = Path.Combine(Server.MapPath("~/Content/images"), fileName);


             try
             {
                 FileUpload.SaveAs(path);

                 dt = ProcessCSV(path);

                 foreach (DataRow row in dt.Rows)
                 {
                     Lead leadImport = new Lead();

                     // order I need columns to appear in CSV
                     // 

                     leadImport.CompanyName = row[0].ToString();
                     leadImport.FirstName = row[1].ToString();
                     leadImport.LastName = row[2].ToString();
                     leadImport.Title = row[3].ToString();
                     leadImport.Email = row[4].ToString();
                     leadImport.StreetAddress = row[5].ToString();
                     leadImport.City = row[6].ToString();
                     leadImport.State_Province = row[7].ToString();
                     leadImport.Zip_PostalCode = row[8].ToString();
                     leadImport.Phone = row[9].ToString();
                     leadImport.Mobile = row[10].ToString();
                     leadImport.Fax = row[11].ToString();
                     leadImport.WebURL = row[12].ToString();
                     leadImport.LeadSource = 1;
                     leadImport.LeadStatus = 2;

                     // If string "Company Name" in header does not appear
                     // first, dump the Datatable and return to different page

                     // no workie
                     if (leadImport.CompanyName != row[0].ToString())
                     {
                         dt.Dispose();
                         return Redirect(Url.Action("LeadProcess"));

                     }
                     else
                         // if all columns are in correct order, carry on
                         // with the import
                     {
                         db.Leads.Add(leadImport);
                     }


                 }
                 db.SaveChanges();

             }
             catch (Exception ex)
             {

                 ViewData["Feedback"] = ex.Message;
             }
         }
         else
         {

             ViewData["Feedback"] = "Please select a file";
         }

         dt.Dispose();
         return Redirect(Url.Action("Index"));
     }

【问题讨论】:

  • 您需要在ProcessCSV 方法中检查列标题。这会在将导入全部加载到 DataTable 之前停止导入
  • leadImport.CompanyName 将始终匹配 row[0].ToString(),因为您将此值设置为高于条件。 (创建Lead 对象后的第一行)
  • 我知道我需要这样做,但我不确定标题的问题究竟出在哪里。我仍然是 .NET MVC 的 n00b,所以这对你们来说可能是一个愚蠢的问题。我很感激帮助。我试试看。
  • 我会检查该行的行数。如果计数与 13 不匹配,您马上就知道它与格式不匹配。
  • 每个 CSV 文件更改的行数。更重要的是,我需要告诉 ProcessCSV 方法以确保首先读取公司名称字符串,然后是 fName、lName、Title 等......只是弄清楚如何做到这一点

标签: c# .net csv model-view-controller


【解决方案1】:

如果您正在解析 CSV,我建议您使用像 CsvHelper 这样的工具。我们一直在用它来完成一个非常相似的任务。它有各种很棒的配置。

var csvConfiguration = new CsvConfiguration
{
    Quote = '"',
    Delimiter = ",",
    TrimFields = true,
    TrimHeaders = true,
    QuoteNoFields = false,
    QuoteAllFields = false,
    HasHeaderRecord = true,
    IsHeaderCaseSensitive = false,
    WillThrowOnMissingField = false
};

var field = csvReader.GetField("YourFieldName"),

它还有一个很不错的mapping functionality

【讨论】:

  • 但是 csv 助手如何验证列顺序和列名?因为我使用的是 csv 助手,但它处理 csv 而不会抛出列顺序和列名异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多