Разобрать файл журнала и получить входные данные - PullRequest
2 голосов
/ 11 сентября 2010

У меня большой файл журнала с несколькими строками, разделенными новой строкой. Каждая строка строки хранит четыре значения.

Если я читаю файл журнала и хочу сохранить эту информацию, какой тип данных / объект мне следует использовать?

Пример:

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

Значения не являются уникальными между строками, и они могут повторяться.

Могу ли я объявить структуру для каждой строки со значениями {источник, назначение, результат, время} и сохранить объект структуры в List<T> для всего файла?

Ответы [ 4 ]

3 голосов
/ 11 сентября 2010

Да, вы можете воспользоваться подходом создания собственного конкретного класса и сделать List этого класса.

В зависимости от размера вашего файла, вы могли бы добиться большего успеха, используя DataTableДля этого:

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);
3 голосов
/ 11 сентября 2010

Да, именно это я и сделаю. Если у вас нет LINQ, вы можете использовать универсальный List со своим собственным классом.

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];
    }
  }

Затем вы можете использовать список следующим образом:

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

Я бы прочитал каждую строку из файла в строку и создал новый класс LogEntry, передав в результате вызов метода String.Split. Код ниже является строго псевдо-кодом.

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

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

Это решение чрезвычайно хрупкое, и любое изменение в формате файла журнала будет ужасно нарушать код, но оно будет работать. Кроме того, вы разбиваете пустое пространство, так что вам лучше убедиться, что вы действительно хотите разбить.

2 голосов
/ 11 сентября 2010
        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);
            }

        }
2 голосов
/ 11 сентября 2010

Бросай свой класс

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

Затем вы можете вызвать Split () для каждой строки ввода, а затем проанализировать каждый элемент String [] в ваших объектах LogEntry.

...