繁体   English   中英

C#如何从文本文件处理后跳过数组中的字符串行号?

[英]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.

有多种解决方案可用,具体取决于您要编写代码的可维护性。

  • 硬编码要删除的文本,以便找到并替换为空字符串
  • 逐行阅读第1行,您将看到所有行的列表,可以忽略它们并对其进行检查
  • 使用正则表达式提取所需内容[PREFERRED]

现实情况是您尝试解析的日志文件似乎不是由您的软件生成的,即您不拥有该格式(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM