[英]C# How to skip String line numbers in Array after processing from Text File?
创建的程序允许用户简单地解析日志文本文件。 该程序只是将文本文件各个部分的分组利用为变量“ sections”数组。
但是,有没有一种方法可以跳过“节”数组的行数? 我尝试使用“拆分”方法,但它不起作用,因为它跳过了许多“节”,而不是每个“节”中的行数。
每个部分中的行应删除:
Restore Point Info Description : Installed VMware Tools Type : Application Install Creation Time : Mon Nov 29 16:53:12 2010
因此,可能有人请提供有关代码的建议吗? 谢谢!
代码:
namespace Testing {
class Program {
static void Main(string[] args) {
TextReader tr = new StreamReader(@"C:\Test\new.txt");
String SplitBy = "----------------------------------------";
// Skip 5 lines of the original text file
for(var i = 0; i < 5; i++) {
tr.ReadLine();
}
// Read the reststring
String fullLog = tr.ReadToEnd();
String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);
//String[] lines = sections.Skip(5).ToArray();
int t = 0;
// Tried using foreach (String r in sections.skip(4)) but skips sections instead of the Text lines found within each sections
foreach (String r in sections) {
Console.WriteLine("The times are : " + t);
Console.WriteLine(r);
Console.WriteLine(sections[6]);
Console.WriteLine("============================================================");
t++;
}
}
}
}
文本日志文件的示例:
Restore Point Info Description : System Checkpoint Type : System Checkpoint Creation Time : Mon Nov 29 16:51:52 2010 J:\syscrawl\Restore\RP1\snapshot\_REGISTRY_MACHINE_SYSTEM ControlSet001\Enum\USBStor not found. ---------------------------------------- Restore Point Info Description : Installed Hex Workshop v5 Type : Application Install Creation Time : Fri Dec 3 04:35:57 2010 J:\syscrawl\Restore\RP10\snapshot\_REGISTRY_MACHINE_SYSTEM USBStor ControlSet001\Enum\USBStor CdRom&Ven_SanDisk&Prod_Ultra_Backup&Rev_8.32 [Wed Dec 1 07:39:09 2010] S/N: 2584820A2890B317&1 [Wed Dec 1 07:39:22 2010] FriendlyName : SanDisk Ultra Backup USB Device CdRom&Ven_WD&Prod_Virtual_CD_070A&Rev_1032 [Wed Dec 1 07:31:33 2010] S/N: 575836314331304639303339&1 [Fri Dec 3 03:03:36 2010] FriendlyName : WD Virtual CD 070A USB Device Disk&Ven_SanDisk&Prod_Ultra_Backup&Rev_8.32 [Wed Dec 1 07:39:09 2010] S/N: 2584820A2890B317&0 [Wed Dec 1 07:39:19 2010] FriendlyName : SanDisk Ultra Backup USB Device ParentIdPrefix: 8&2f23e350&0 Disk&Ven_WD&Prod_My_Passport_070A&Rev_1032 [Wed Dec 1 07:31:33 2010] S/N: 575836314331304639303339&0 [Fri Dec 3 03:03:36 2010] FriendlyName : WD My Passport 070A USB Device Other&Ven_WD&Prod_SES_Device&Rev_1032 [Wed Dec 1 07:31:33 2010] S/N: 575836314331304639303339&2 [Fri Dec 3 04:08:49 2010] ---------------------------------------- Restore Point Info Description : Installed VMware Tools Type : Application Install Creation Time : Mon Nov 29 16:53:12 2010 J:\syscrawl\Restore\RP2\snapshot\_REGISTRY_MACHINE_SYSTEM ControlSet001\Enum\USBStor not found.
有多种解决方案可用,具体取决于您要编写代码的可维护性。
现实情况是您尝试解析的日志文件似乎不是由您的软件生成的,即您不拥有该格式(VMWare拥有)。 因此,我相信此格式可以通过任何更新进行更改,因此可以对您需要或不需要的格式文本进行硬编码,这会使您的软件非常脆弱。
我建议使用Regex,也许您会花一些时间编写该表达式,但它干净实用。
由于您要保留的行数可以更改,因此一种解决方案是在要删除的每一行的开头使用令牌/字符,以确保不会在其他日志行中出现。 例如:
$Restore Point Info
$Description : Installed VMware Tools
$Type : Application Install
$Creation Time : Mon Nov 29 16:53:12 2010
现在您可以执行以下操作:
if(line[0]=="$")
continue;
编辑:因为您只能读取文件
我认为您可以尝试使用肮脏的方式来做到这一点:
bool ShouldSkip(string line)
{
return (line.StartsWith("Restore Point Info") || line.StartsWith("Description") || line.StartsWith("Type") || line.StartsWith("Creation Time"))
}
用法:
//in your main method
foreach(var line in lines)
{
if(ShouldSkip(line))
continue;
}
我不知道这是您要找的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.