чтение файлов .log и отображение данных - PullRequest
0 голосов
/ 15 января 2020

У меня есть файл журнала, который выглядит следующим образом:

2019-12-24 18:00:17.8105|DEBUG|--------------------------------
https://...
2019-12-24 18:00:17.8105|DEBUG|Key: xxxxxxxxxxxxxxxxxxxxxxxx
{
  "Id": "xxxxxxx",
  "Times": "2019-12-24",
  "Data": {
    "Id": 8,
    "Code": "5",
    "Description": "abc",
  },
 "Number": 1,
 ...
}
2019-12-24 18:00:17.8105|DEBUG|--------------------------------
https://...
2019-12-24 18:00:17.8105|DEBUG|Key: xxxxxxxxxxxxxxxxxxxxxxxx
{
  "Id": "xxxxxxx",
  "Times": "2019-12-24",
  "Data": {
    "Id": 6,
    "Code": "3",
    "Description": "def"
  },
  "Number": 3,
  ...
}
//...and it repeats several times in this file with diferent data

Моя цель - получить только часть внутри "{...}", добавить ее в массив объектов и быть похожей на

Array: 
[
   {"Id": "xxxxxxx", "Times": "2019-12-24", "Data": { "Id": 8, "Code": "5", "Description": "abc"}}
   {"Id": "xxxxxxx", "Time": "2019-12-24", "Data": { "Id": 6, "Code": "3", "Description": "def"}}
]

Что у меня есть:

Я знаю, что могу использовать объект File для чтения файла, поэтому в моем index.cs html я положил:

    @{
        var result = "";

        Array log = null;

        var dataFile = Server.UrlPathEncode("C:/Temp/test.log");

        if (File.Exists(dataFile))
        {
            log = File.ReadAllLines(dataFile);
            if (log == null)
            {
                result = "The file is empty.";
            } 
        }
        else
        {
            result = "The file does not exist.";
        }
    }

но я понятия не имею, как просто получить то, что находится внутри фигурных скобок, и преобразовать в объект

Примечания :

  • I Я использую APS. NET mvc.
  • Я предпочитаю использовать регулярные выражения, если это возможно
  • Данные являются динамическими c, они могут изменяться в файле

ОБНОВЛЕНИЕ:

, чтобы получить часть файла .log, который я сделал:

foreach (var item in log)
{
   text += item;
}

Regex regex = new Regex(@"(?={)[^}]*(?=})", RegexOptions.IgnoreCase);
matches = regex.Matches(text);

но это регулярное выражение не получает все, что я хочу, оно просто получает до "Description": "abc",} и я хочу получить также "Number": ...

Я использовал эту ссылку для текстового регулярного выражения

кто-то может помочь с регулярным выражением?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Вариант 1: Используйте регулярное выражение, подобное (? <= {) [^} {] * (? =}), Чтобы получить содержимое JSON из файла журнала. </p>

Regex regex = new Regex(@"(?<=\{)[^}{]*(?=\})", RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(str);

Вариант 2 : L oop через все строки, и если вы найдете {продолжайте добавлять следующие строки в строку, пока не найдете}. Вы должны отметить число {должно соответствовать числу}

0 голосов
/ 16 января 2020

Ниже будет работать образец:

public class MyData
{
    public string Id { set; get; }
    public string Times { set; get; }
    public Data Data { set; get; }
    public string Number { set; get; }
}

public class Data
{
    public string Id { set; get; }
    public string Code { set; get; }
    public string Description { set; get; }
}

var lines = File.ReadAllLines(@"C:\Temp\data.txt").Where(line => !line.StartsWith("2019"));
var jsonString = "[" + String.Join("", lines) + "]";
jsonString = jsonString.Replace("}", "},");
jsonString = jsonString.Replace("},,", "},");
var myObjectDT = JsonConvert.DeserializeObject<List<MyData>>(jsonString);
foreach(var item in myObjectDT)
{
    string line = JObject.FromObject(item).ToString(Formatting.None);
    //write line to file
}
...