C# 从文本文件中读取行,检查内容是否符合标准
嘿,我对C#很陌生,所以我只是在尝试如何利用它来执行任务。 我希望它通过一个文本文件,并确保每一行都是正确的,文本文件的示例格式为:C# 从文本文件中读取行,检查内容是否符合标准,c#,file,streamreader,C#,File,Streamreader,嘿,我对C#很陌生,所以我只是在尝试如何利用它来执行任务。 我希望它通过一个文本文件,并确保每一行都是正确的,文本文件的示例格式为: ;irrelevant ;ignored table Driver number 123 name Name123 chassis Mondeo rank 1 race_image 100 body_style ccar wheel_basename vauxhall end table Driver number 178 name Dan#178 chas
;irrelevant
;ignored
table Driver
number 123
name Name123
chassis Mondeo
rank 1
race_image 100
body_style ccar
wheel_basename vauxhall
end
table Driver
number 178
name Dan#178
chassis XJS
rank 1
race_image 100
body_style ccar
end
table Driver
number 76
name Timmy76!
chassis Lexus
rank 1
race_image 100
body_style ccar
wheel_basename lexb
end
end
它需要忽略空行,或者只包含空格的行,并且不区分大小写。当它通过时,在它检查每一行之后,我希望它在控制台窗口上显示它,这样一旦它发现错误,它就可以向用户显示错误所在;所以会有源源不断的线,直到它发现错误
它需要检查每个部分
- 如果存在“表格驱动程序”,请检查下一行,否则停止并通知用户
- 检查“数字”,然后检查1-3位数字后的实际数字,否则停止并通知用户
- 勾选“name”,后面的实际名称值可以是任何内容,否则停止并通知用户
- 检查“机箱”后的实际机箱值必须是列表中的指定字符串,否则停止并通知用户
- 检查“等级”,然后检查实际等级编号是否在1-10之间,否则停止并通知用户
- 如果出现“race_image 100”,请检查下一行,否则停止并通知用户
- 如果存在“body_style ccar”,请检查下一行,否则停止并通知用户
- wheel_基线是可选的
- 如果存在“wheel_basename”,请检查列表中指定字符串后的值,否则停止并通知用户
- 如果“wheel_basename”不存在,请检查下一行
- 如果有两个端点,每个端点位于不同的行上,那么可能会有一个“goto”函数并显示一条checking complete消息
- 如果只有一个end,则需要在下一个drivers表中再次启动该过程
using (StreamReader textFile = new StreamReader("Drivers.txt"))
{
foreach (var line in File.ReadLines("Drivers.txt"))
if (line.StartsWith(";"))
{
Console.WriteLine(line);
continue;
}
foreach (var line in File.ReadLines("Drivers.txt"))
if (line.StartsWith("table driver", StringComparison.CurrentCultureIgnoreCase))
{
Console.WriteLine(line);
continue;
}
else
{
Console.WriteLine("ERROR");
// Console.ReadLine();
}
}
正如其他人所评论的,XML将使这变得更容易,但是如果更改数据源不是一个选项,那么这可以很容易地解决 首先,每次对文件启动foreach循环时,都是从头开始。一旦内部循环完成,前一个循环将在它停止的地方继续 例如: 如果您有以下代码:
foreach(string loop1 in File.ReadLines("data.txt"))
{
Console.WriteLine("loop1: " + loop1);
foreach(string loop2 in File.ReadLines("data.txt"))
{
Console.WriteLine("loop2: " + loop2);
foreach(string loop3 in File.ReadLines("data.txt"))
{
Console.WriteLine("loop3: " + loop3);
}
}
}
使用以下数据集:
one 1
two 2
three 3
您的输出如下所示:
loop1: one 1
loop2: one 1
loop3: one 1
loop3: two 2
loop3: three 3
loop2: two 2
loop3: one 1
loop3: two 2
loop3: three 3
loop2: three 3
loop3: one 1
loop3: two 2
loop3: three 3
loop1: two 2
loop2: one 1
.... continued ....
就解析而言,一个简单的解决方案是将逻辑放在switch语句中。
例如:
foreach(string loop1 in File.ReadLines("data.txt"))
{
if (String.IsNullOrEmpty(line))
{
continue;
}
if (line.Equals("end"))
{
//do stuff
}
string[] parts = line.Split(" ");
if (parts.Length != 2)
{
//do stuff
}
switch(line[0])
{
case "one":
if (!line[1].Equals("1"))
{
Console.WriteLine("ERROR! One != 1");
}
break;
case "two":
....
default:
//not recognized. Do stuff
break;
}
}
它会重新开始,因为您第二次使用File.ReadLines。另外,请修复缩进,您缺少了一些{},很难理解。
XML
将是您更好的选择。在XML
中编写该文件,如果您已经加载了Drivers.txt三次,那么解析该文件就很容易了。而且您还没有使用textFile变量。