我试图从文本文件中读取数据,创建一些对象并使用。
我的文字内容实际上是这样的。
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%折扣,sicne它听起来并不复杂,但找不到合适的方法。
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?
}
}
答案 0 :(得分: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);
}
}
}
}
}
}
}
}