2017-03-07 81 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); 
          } 
         } 
        } 
       } 
      } 
     }    
    }   
} 
相關問題