2017-07-27 65 views
-2

我正在逐行读取来自excel文件(实际上是逗号分隔的csv文件)列的数据,该文件被外部实体发送。要在列read是00.00格式的时间,所以使用拆分方法读取所有不同的列,但是该文件有时会带有额外的列(元素之间的逗号),因此拆分元素现在总是正确的。下面是用于读取和拆分不同列的代码,这些元素将被保存在数据库中。使用继续关键字来处理循环

public void SaveFineDetails() 
    { 
     List<string> erroredFines = new List<string>(); 
     try 
     { 
      log.Debug("Start : SaveFineDetails() - Saving Downloaded files fines.."); 
      if (!this.FileLines.Any()) 
      { 
       log.Info(string.Format("End : SaveFineDetails() - DataFile was Empty")); 
       return; 
      } 

      using (RAC_TrafficFinesContext db = new RAC_TrafficFinesContext()) 
      { 
       this.FileLines.RemoveAt(0); 
       this.FileLines.RemoveAt(FileLines.Count - 1); 

       int itemCnt = 0; 
       int errorCnt = 0; 
       int duplicateCnt = 0; 
       int count = 0; 

       foreach (var line in this.FileLines) 
       { 
        count++; 
        log.DebugFormat("Inserting {0} of {1} Fines..", count.ToString(), FileLines.Count.ToString()); 

        string[] bits = line.Split(','); 
        int bitsLength = bits.Length; 
        if (bitsLength == 9) 
        { 
         string fineNumber = bits[0].Trim(); 
         string vehicleRegistration = bits[1]; 
         string offenceDateString = bits[2]; 
         string offenceTimeString = bits[3]; 
         int trafficDepartmentId = this.TrafficDepartments.Where(tf => tf.DepartmentName.Trim().Equals(bits[4], StringComparison.InvariantCultureIgnoreCase)).Select(tf => tf.DepartmentID).FirstOrDefault(); 
         string proxy = bits[5]; 
         decimal fineAmount = GetFineAmount(bits[6]); 
         DateTime fineCreatedDate = DateTime.Now; 
         DateTime offenceDate = GetOffenceDate(offenceDateString, offenceTimeString); 
         string username = Constants.CancomFTPServiceUser; 
         bool isAartoFine = bits[7] == "1" ? true : false; 
         string fineStatus = "Sent"; 

         try 
         { 
          var dupCheck = db.GetTrafficFineByNumber(fineNumber); 
          if (dupCheck != null) 
          { 
           duplicateCnt++; 
           string ExportFileName = (base.FileName == null) ? string.Empty : base.FileName; 
           DateTime FileDate = DateTime.Now; 
           db.CreateDuplicateFine(ExportFileName, FileDate, fineNumber); 
          } 
          else 
          { 
           var adminFee = db.GetAdminFee(); 
           db.UploadFTPFineData(fineNumber, fineAmount, vehicleRegistration, offenceDate, offenceDateString, offenceTimeString, trafficDepartmentId, proxy, false, "Imported", username, adminFee, isAartoFine, dupCheck != null, fineStatus); 
          } 

          itemCnt++; 
         } 
         catch 
         { 
          errorCnt++; 
         } 
        } 
        else 
        { 
         erroredFines.Add(line); 
         continue; 
        } 

       } 

现在的问题是,这个文件并不总是与9种元素如我们预期,例如在该图像上,该线是不一样的(忽略第一行,它的头文件)CSV lines

在第一行FM应该是36DXGP的一部分,而不是两个分离的元素。这意味着列现在是额外的。现在这引起我们手头的问题,这是时间因素,因为额外的昏迷,时间现在是别的,现在读为,所以时间元素上的分割根本不起作用。因此,我所做的是,读取不正确的行,检查其长度,如果长度不是9,则将其添加到错误列表并继续。

但我的继续关键词似乎并没有工作,它进入了其他部分,然后回去读取相同的错误行。

我检查了关于Break vs Continue的答案,他们提供了很好的例子,说明如何继续工作,我介绍了其他的,因为这个例子的格式对我来说没有用(其他方面也没有任何区别)。这里是样本数据,

注意第一行被读取始于96

H,1789,,,,,,,, 
96/17259/801/035415,FM,36DXGP,20161216,17.39,city hall-cape town,Makofane,200,0,0 
MA/80/034808/730,CA230721,20170117,17.43,malmesbury,PATEL,200,0,0, 

它是什么,我在这里做

+1

请提供[MCVE] 它真的很难理解你想要什么实现和你的代码应该做什么 –

+0

它看起来像你的代码应该没问题。添加数据样本而不是截图会更有用 - 然后我们可以通过剪切和粘贴来编写一些代码来测试。 – PaulF

+0

您是否试过用调试器单步执行代码以查看可能发生了什么? – PaulF

回答

0

我建议你使用性能和可读性的原因如下过载能力:

line.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)l 
0

这样的错误我已经找到一种方法来解决我的问题,由于拖尾逗号导致一个空的元素,线的长度有问题,然后我用这个代码摆脱这个空元素,并确定新的长度

bits = bits.Where(x => !string.IsNullOrEmpty(x)).ToArray(); int length = bits.Length

一切都很好,现在

+0

”建议您使用以下重载“,您可能忘记包含您在此提及的实际重载代码(方法):) – Ronny