2017-03-07 75 views
0

我试图从文本文件中读取数据,创建一些对象并使用它。阅读文本文件并将其转换为对象

我的文字内容其实是这样的。

Server : V2JJFERPP98 
ERROR 0 : 5039 
ERROR 3 : 0 
ERROR 4 : 1915 
ERROR 8 : 0 
ERROR 9 : 0 

Server : V2JJFERPP99 
ERROR 0 : 0 
ERROR 3 : 0 
ERROR 4 : 15 
ERROR 8 : 0 
ERROR 9 : 1 

Server : V2JJFERPP100 
ERROR 0 : 0 
ERROR 3 : 1 
ERROR 4 : 0 
ERROR 8 : 0 
ERROR 9 : 0 

V2JJFERPP98 | Error parsing database 
V2JJFERPP100 | can't create lof file 
V2JJFERPP100 | can't read backup_01_03_2017 

基本上,我的目标是在文件中获取与错误报告一样多的对象。然后,在第二部分获取所有cronjob错误。

我已经为第一部分创建了一个对象,就像这样。

private string server { get; set; } 
private int error0 { get; set; } 
private int error3 { get; set; } 
private int error4 { get; set; } 
private int error8 { get; set; } 
private int error9 { get; set; } 

但现在,我不知道如何继续获取对象。

首先,我正在考虑读取整个文件,并将所有内容放入var中,然后使用正则表达式来检查内容。

我也检查了读取每一行的可能性,并根据行的开始,开始创建一个对象。

对于这两种方法,我不知道如何做到这一点。

我已经尝试了很多东西,但我认为我是100%折扣,它听起来不是很复杂,但找不到合适的方法来做到这一点。

string [] lines = File.ReadAllLines(missionFilePath);

foreach (string line in lines) 
{ 
    // for each line, we gonna create a new MissionState object 
    if (line.StartsWith("Serveur")) 
    { 
     // Server : V2JJFERPP98 
     var server = line.Substring(9); 
     // and now, how to get error, and know when the new/next object come? 
    } 
} 
+1

你为什么不考虑使用文本文件分析器?那里有很多东西。快速搜索产生了这个,例如https://textfileparsers.codeplex.com/ –

+1

“如何获取错误” - 阅读下一行。 “如何知道下一个对象何时到来” - 在你的例子中它们被空行分割。 – Evk

+0

@ rory.ap我会尝试这种类型的,但是当它发生cronjob日志时,它不再是文件的结尾,而是尴尬。但我会试一试,如果这是最好的办法。 Evk:同上,我不确定日志结束。另外,如何正确地得到这些错误和服务器的对象(猜我缺少算法的一些技巧) –

回答

0

如果你只有一个结构来解析,只想完成一项工作 - 你可以自己解析它,因为它很简单。否则,寻找第三方解决方案来帮助你。这里是一个如何解析文件的例子。首先定义一个类:

class Server { 
    public string Name { get; set; } 
    public int Error0 { get; set; } 
    public int Error3 { get; set; } 
    public int Error4 { get; set; } 
    public int Error8 { get; set; } 
    public int Error9 { get; set; } 
    public List<string> CronJobErrors { get; set; } = new List<string>(); 
} 

然后解析马上:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var servers = new Dictionary<string, Server>(); // parse results are here 
     using (var fs = File.OpenRead(@"G:\tmp\so\parse.txt")) { 
      using (var reader = new StreamReader(fs)) { 
       string line; 
       Server current = null;      
       while ((line = reader.ReadLine()) != null) { 
        // line break - end of server definition 
        if (String.IsNullOrWhiteSpace(line)) { 
         if (current != null) { 
          servers.Add(current.Name, current); 
          current = null; 
         } 
         continue; 
        } 
        var cidx = line.IndexOf(':'); // split by colon 
        if (cidx >= 0) { 
         var name = line.Substring(0, cidx).Trim(); 
         var value = line.Substring(cidx + 1).Trim(); 
         // ugly switch 
         switch (name) { 
          case "Server": 
           current = new Server() {Name = value}; 
           break; 
          case "ERROR 0": 
           if (current == null) 
            throw new Exception("Invalid line"); // more details here, just example 
           current.Error0 = int.Parse(value); 
           break; 
          case "ERROR 3": 
           if (current == null) 
            throw new Exception("Invalid line"); // more details here, just example 
           current.Error3 = int.Parse(value); 
           break; 
          case "ERROR 4": 
           if (current == null) 
            throw new Exception("Invalid line"); // more details here, just example 
           current.Error4 = int.Parse(value); 
           break; 
          case "ERROR 8": 
           if (current == null) 
            throw new Exception("Invalid line"); // more details here, just example 
           current.Error8 = int.Parse(value); 
           break; 
          case "ERROR 9": 
           if (current == null) 
            throw new Exception("Invalid line"); // more details here, just example 
           current.Error9 = int.Parse(value); 
           break; 
         } 
        } 
        else { 
         var tdix = line.IndexOf('|'); 
         if (tdix >= 0) { 
          var name = line.Substring(0, tdix).Trim(); 
          var value = line.Substring(tdix + 1).Trim(); 
          if (servers.ContainsKey(name)) { 
           servers[name].CronJobErrors.Add(value); 
          } 
         } 
        } 
       } 
      } 
     }    
    }   
} 
相关问题