使用 continue 关键字进行循环处理
Use continue key word to processed with the loop
我正在从 excel 文件(实际上是逗号分隔的 csv 文件)列 line-by-line 读取数据,该文件由外部 entity.Among 发送要读取的列是时间,采用 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 个元素,例如在这张图片上,行不一样(忽略第一行,它的 headers)
第一行 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,
我这里做错了什么
我找到了解决问题的方法,由于尾随的逗号导致了空元素,因此行的长度存在问题,然后我用这段代码摆脱了这个空元素并确定了新长度
bits = bits.Where(x => !string.IsNullOrEmpty(x)).ToArray();
int length = bits.Length
现在一切都很好
出于性能和可读性原因,我建议您使用以下重载:
line.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)l
我正在从 excel 文件(实际上是逗号分隔的 csv 文件)列 line-by-line 读取数据,该文件由外部 entity.Among 发送要读取的列是时间,采用 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 个元素,例如在这张图片上,行不一样(忽略第一行,它的 headers)
第一行 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,
我这里做错了什么
我找到了解决问题的方法,由于尾随的逗号导致了空元素,因此行的长度存在问题,然后我用这段代码摆脱了这个空元素并确定了新长度
bits = bits.Where(x => !string.IsNullOrEmpty(x)).ToArray();
int length = bits.Length
现在一切都很好
出于性能和可读性原因,我建议您使用以下重载:
line.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)l