Разбор текста потокового журнала с разбивкой по индексу - PullRequest
0 голосов
/ 17 октября 2019

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

Файлы журналов и ожидаемый вывод приведены ниже. Файлы журнала всегда начинаются с индекса из 13 цифр (вероятно, дополненного), поэтому я принимаю это за индекс. Затем я разделяю содержимое по индексу, чтобы получить первые начальные строки. Затем я помещаю это в цикл while, проверяя, может ли файл что-либо разделить с помощью lines.length > 1.

Я заметил, что я использовал расщепление неправильно, так как он предназначен только для поиска концов строк, а не там, где они начинаются. В противном случае это будет работать с ожидаемым результатом. С учетом сказанного, есть ли легкое решение для этого частичного решения, которое у меня есть?

var reader = new FileReader();
var output = [];

reader.readAsText(f, "UTF-8");

            // if file read successful then text string stored in the result property of FileReader()
            reader.onload = function(evt){
                var fileContents = evt.target.result;
                var index = fileContents.slice(0,13);
                var lines = fileContents.split(index);

                // Continue splitting until we fail (nothing split = 1)
                //while(lines.length > 1){
                    for(var i = 0; i < lines.length; i++){
                        output.push(index + ' ' + lines[i] + '<br>')
                    }

                    // go to next lines
                    index++;
                    lines = fileContents.split(index);
                //}

                document.getElementById('content').innerHTML = '<ul>' + output.join('') + '</ul>';
            }

Предоставленный файл журнала:

1564001512016 INFO: LOG MANAGER jdshfkjaafhdskfdsajfdsadsfj 1564001512016 INFO: some test stuff 1564001512016 INFO: kjhdshfakhfdskjdshkjfdsh 1564001512017 INFO: hjkdsahfjkfhdskjfdsahkfdskjfdsakjfds 1564001512017 INFO: hdskjahfjfdshdfsahfdsajfdsa

Фактический вывод:


1564001512016 INFO: LOG MANAGER jdshfkjaafhdskfdsajfdsadsfj
1564001512016 INFO: some test stuff 
1564001512016 INFO: kjhdshfakhfdskjdshkjfdsh 1564001512017 INFO: hjkdsahfjkfhdskjfdsahkfdskjfdsakjfds 1564001512017 INFO: hdskjahfjfdshdfsahfdsajfdsa

Ожидаемый вывод:

1564001512016 INFO: LOG MANAGER jdshfkjaafhdskfdsajfdsadsfj 
1564001512016 INFO: some test stuff
1564001512016 INFO: kjhdshfakhfdskjdshkjfdsh 
1564001512017 INFO: hjkdsahfjkfhdskjfdsahkfdskjfdsakjfds 
1564001512017 INFO: hdskjahfjfdshdfsahfdsajfdsa

Обновление: С ответом ниже я смог адаптировать его к своему коду ниже. Некоторые заметные изменения добавили обратно строку INFO, которая была удалена с помощью split (по какой-то причине) и сохранила int i в переменную x, чтобы не увеличивать 3-е на каждой итерации:

                var fileContents = evt.target.result;
                var regex = /(\d{13}) INFO:/
                var lines = fileContents.split(regex);

                // i starts at 1 as split seems to always return empty at 0
                for(var i = 1; i < lines.length; i+=2){
                    var x = i;
                    var index = lines[x]
                    var context = lines[x+1]
                    // \xa0 = space
                    output.push('<li>' + index + "\xa0INFO:\xa0\xa0" + context + '</li>')
                }
                document.getElementById('content').innerHTML = output.join('') + '</br>';

Результат:

1564001512016 INFO:  LOG MANAGER jdshfkjaafhdskfdsajfdsadsfj 
1564001512016 INFO:  some test stuff
1564001512016 INFO:  kjhdshfakhfdskjdshkjfdsh 
1564001512017 INFO:  hjkdsahfjkfhdskjfdsahkfdskjfdsakjfds 
1564001512017 INFO:  hdskjahfjfdshdfsahfdsajfdsa

1 Ответ

1 голос
/ 17 октября 2019

Поскольку индекс периодически изменяется, окончаний строк нет, а сообщение журнала может содержать произвольный текст, надежного способа анализа этого файла нет. Вы можете приблизиться с регулярными выражениями, однако:

var regex = /(\d{13}) INFO:/
var lines = fileContents.split(regex);

for(var i = 1; i < lines.length; i+=2){
    var index = lines[i];
    var line = lines[i+1];
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...