2 Stimmen

Analysieren einer Protokolldatei und Abrufen von Eingabedaten

Ich habe eine große Protokolldatei mit mehreren Zeilen, die durch eine neue Zeile getrennt sind. Jeder Zeileneintrag speichert vier Werte.

Wenn ich die Protokolldatei lese und diese Informationen speichern möchte, welchen Datentyp/welches Objekt sollte ich dann verwenden?

Beispiel:

source1 destination1 result time
source2 destination1 result time
sources3 destination2 result time

Die Werte sind zwischen den Zeilen nicht eindeutig und können sich wiederholen.

Kann ich für jede Zeile eine Struktur mit den Werten {Quelle, Ziel, Ergebnis, Zeit} deklarieren und das Strukturobjekt in einem List<T> für die gesamte Datei?

3voto

palswim Punkte 11356

Ja, Sie können den Ansatz wählen, eine eigene spezifische Klasse zu erstellen und eine List dieser Klasse.

Je nachdem, wie groß Ihre Datei ist, können Sie besser eine DataTable um dies zu tun:

var dt = new DataTable();
dt.Columns.Add(new DataColumn("Source", typeof(string)));
dt.Columns.Add(new DataColumn("Destination", typeof(string)));
dt.Columns.Add(new DataColumn("Result", typeof(string)));
dt.Columns.Add(new DataColumn("Timestamp", typeof(DateTime)));

var dr = dt.NewRow();
dr["Source"] = "DATA";
dr["Destination"] = "DATA";
dr["Result"] = "DATA";
dr["Timestamp"] = DateTime.Now;
dt.Rows.Add(dr);

3voto

Justin Punkte 3832

Ja, das ist genau das, was ich tun würde. Wenn Sie nicht LINQ haben, können Sie generische Liste mit einer benutzerdefinierten Klasse von Ihrem eigenen verwenden.

public class LogEntry
{
     private String _source = String.Empty;
     private String _destination = String.Empty;
     private String _result = String.Empty;
     private String _time = String.Empty;

     public String Source
     {
         get { return _source; }
         set { _source = value; }
     }

     public String Destination
     {
            get { return _source; }
            set { _source = value; }
     }

     public String Result
     {
         get { return _source; }
         set { _source = value; }
     }

     public String Time
     {
         get { return _source; }
         set { _source = value; }
     }

     public LogEntry()
     {
     }

     public LogEntry( String source, String destination, String result, String time )
     {
         _source = source;
         _destination = destination;
         _result = result;
         _time = time;
     }

    public LogEntry( String[] args )
    {
        _source = args[0];
        _destination = args[1];
        _result = args[2];
        _time = args[3];
    }
  }

Sie können dann eine Liste wie diese verwenden:

 List<LogEntry> _logEntries = new List<LogEntry>();

Ich würde jede Zeile aus der Datei in einen String einlesen und eine neue LogEntry-Klasse erstellen, die das Ergebnis eines String.Split-Methodenaufrufs enthält. Der folgende Code ist ein reiner Pseudo-Code.

char[] splitter = new char[1];
splitter[0] = ' ';

while( readLines into String )
{
   _logEntries.Add( new LogEntry( String.Split( splitter ) ) );
}

Diese Lösung ist extrem brüchig, und jede Änderung des Protokolldateiformats führt zu einem Bruch des Codes, aber sie funktioniert. Auch Ihr brechen auf Leerzeichen, so dass Sie besser sicherstellen, dass das ist, was Sie wirklich auf zu brechen wollen.

2voto

Jeff LaFay Punkte 12384

Rollen Sie Ihre eigene Klasse

public class LogEntry
{
    public string Source;
    public string Destination;
    public DateTime ResultTime;
}

Sie könnten dann Split() für jede Eintragszeile aufrufen und dann jedes Element des String[] in Ihre LogEntry-Objekte parsen.

2voto

nilphilus Punkte 570
        class YourType
        {
            public String Source { get; private set; }
            public String Destination { get; private set; }
            public String Resoult { get; private set; }
            public String Time { get; private set; }

            //or func returning bool and remove exception
            public YourType(String line)
            {
                var split = line.Split(' ');

                if (split.Length != 4)
                    throw new ArgumentException();

                Source = split[0];
                Destination = split[1];
                Resoult = split[2];
                Time = split[3];
            }

        }

        public Main()
        {
            String values =
 @"source1 destination1 result time
source2 destination1 result time
sources3 destination2 result time";

            var v = from line in values.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                    select new YourType(line);

            foreach (var it in v)
            {
                Console.WriteLine(it.Source);
            }

        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X