【问题标题】:Use continue key word to processed with the loop使用 continue 关键字与循环一起处理
【发布时间】:2017-07-27 10:28:18
【问题描述】:

我正在逐行读取 excel 文件(实际上是逗号分隔的 csv 文件)列中的数据,该文件由外部实体发送。要读取的列中是时间,即 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 个元素,例如在这张图片上,行不一样(忽略第一行,它的标题)

在第一行 FM 应该是 36DXGP 的一部分,而不是两个单独的元素。这意味着列现在是额外的。现在这给我们带来了手头的问题,即时间元素,因为额外的昏迷,时间现在是别的东西,现在读作20161216,所以时间元素上的拆分不是工作。所以我所做的是,读取错误的行,检查其长度,如果长度不是 9,则将其添加到错误列表并继续。

但我的 continue 关键字似乎不起作用,它进入 else 部分,然后返回阅读相同的错误行。

我已经检查了Break vs Continue 上的答案,它们提供了关于 continue 工作原理的很好示例,我介绍了 else 是因为此示例中的格式对我不起作用(当然 else 也没有任何区别)。这是样本数据,

注意要读取的第一行以 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,

我在这里做错了什么

【问题讨论】:

  • 请提供minimal reproducible example 真的很难理解你想要实现什么以及你的代码应该做什么
  • 看起来你的代码应该没问题。添加数据样本而不是屏幕截图会更有用 - 然后我们可以进行剪切和粘贴以编写一些代码进行测试。
  • 您是否尝试过使用调试器单步执行代码以查看可能发生的情况?
  • 没什么。您不需要 continue ,然后 else 执行相同的功能。我不认为带 FM 的线路是错误的。我认为它表明了不同的格式。正确的做法是检查 if(bits[1] == "FM") 并区别对待数据。
  • @PaulF 我添加了示例数据并删除了一些不必要的信息,还做了一些语法修复,是的,当我单步执行代码时,它只是回到循环的开头,但是它不是读取第二行,而是读取相同的第一行

标签: c# csv continue


【解决方案1】:

我找到了解决问题的方法,行的长度有问题,因为尾随逗号导致空元素,然后我用这段代码去掉了这个空元素并确定了新的长度

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

现在一切正常

【讨论】:

  • “建议您使用以下重载”,您可能忘记在此处包含实际的重载代码(方法):)
【解决方案2】:

出于性能和可读性的原因,我建议您使用以下重载:

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

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2021-11-16
    • 2012-12-21
    • 2022-09-27
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多