Разделить строки журнала сервера на массив и прочитать как индекс, также grep для ключевых слов

#javascript

#javascript

Вопрос:

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

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

 27/03/19 12:36:18:193 LINE 1

27/03/19 12:36:18:198 LINE 2

27/03/19 12:36:18:198 LINE 3 LINE 3.1

27/03/19 12:36:18:199 LINE 4

27/03/19 12:36:18:199 LINE 5 LINE 5.1

27/03/19 12:36:25:045 LINE 6
  

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

т. е.

 #0|  27/03/19   #1|  12:36:18:199   #2|  LINE 5    #3|  LINE 5.1
data[2] = LINE 5
  

Также иметь возможность использовать grep для ключевого слова и выводить его.

Примечание. файл является журналом сервера, поэтому его необходимо будет читать в режиме реального времени.

Заранее спасибо за ваши ответы, Коди

 <img id='output'>
<script>
  var openFile = function(event) {
    var input = event.target;

    var reader = new FileReader();
    reader.onload = function(){
      var text = reader.result;
      console.log(reader.result);
    };
    reader.readAsText(input.files[0]);
  };
</script>
  

Комментарии:

1. клиентский javascript НЕ может читать файл в режиме реального времени, поскольку для открытия и чтения локального файла ему требуется пользовательский ввод. Также были попытки использовать регулярные выражения для разделения содержимого файла?

2. Итак, лучше всего использовать что-то вроде NodeJS, верно?

3. node.js это серверная технология, поэтому это зависит от вашего приложения и цели чтения файла журнала. Но да node.js можете делать это в режиме реального времени

4. Что касается разделения содержимого вашего файла, вы должны использовать регулярные выражения. С помощью ^((?:d{2}/?){3})s ((?:d{2}:){3}d{3})s (. )$ вы сможете разделять дату, время и содержимое строк (с line A и line A.B в одной группе). Это регулярное выражение может быть обновлено, если в ваших строках есть разделители, чтобы разделить line A и line A.B .

Ответ №1:

Чтение файлов

Если это журнал сервера, и вы хотите обрабатывать эту клиентскую часть в реальном времени, то вам нужно:

Сервер

  • Создайте сервер nodejs, который просматривает ваш файл журнала на предмет любых изменений, которые могут быть сделаны с fs.Watch и обеспечивает соединение с сокетом

Клиент

  • Создайте веб-сокет, который получает уведомления с вашего сервера всякий раз, когда ваш файл журнала изменяется с отправленными данными (обратите внимание, что библиотека веб-соединений сервера также предлагает клиентскую версию, которая поддерживается во всех браузерах, ознакомьтесь с их примерами чтобы быстро понять)
  • Всякий раз, когда отправляются новые данные, просто вызывайте приведенный ниже скрипт и обновляйте свое представление

Зачем создавать отдельный сервер для обработки этого?

  • Что ж, если вы еще не используете сервер nodejs, то создать сервер nodejs быстро и просто.

  • Это функция, выходящая за рамки того, на чем сосредоточен ваш основной сервер

Обработка данных журнала:

Частичная реализация того, как читать содержимое вашего файла журнала. Вам нужно будет определить шаблон для разделения LINE 5 LINE 5.1 , поскольку этот текущий скрипт просто разбивается на пробелы. Если в каждом из них LINE нет пробелов, то это сработает.

 const data = `
27/03/19 12:36:18:193 LINE 1

27/03/19 12:36:18:198 LINE 2

27/03/19 12:36:18:198 LINE 3 LINE 3.1

27/03/19 12:36:18:199 LINE 4

27/03/19 12:36:18:199 LINE 5 LINE 5.1

27/03/19 12:36:25:045 LINE 6
`

const res = data
.trim()
.split(/n /)
.map(line=>line.split(/s/));

console.log(res)  

Комментарии:

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

Ответ №2:

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

 function parseContends(inputString){
  if(inputString != null){
    var string = inputString.match(/S /g) || [];
    var stringArray = new Array();
    for(var i =0; i < string.length; i  ){
      stringArray.push(string[i]);
    }
  }
  console.log(stringArray);
}

parseContends("27/03/19 12:36:18:198 LINE 3 LINE 3.1");  

Приведенный выше фрагмент был обновлен в Code Pen, вы можете увидеть вывод в консоли.

 [https://codepen.io/redhatvicky/pen/QoXLYw][1]
  

Комментарии:

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

2. Спасибо, но я не понимаю, как я могу выбрать и просмотреть мой файл в режиме реального времени?

3. В режиме реального времени, если файлы журнала должны быть проанализированы. Есть два подхода: первый заключается в том, что вы пишете небольшой фрагмент javascript, который может собирать файлы журнала в периодическом формате, а затем разбирать файл построчно, чтобы применить логику разделения на основе разделителя. Второй подход — это приведенный ниже подход, о котором упоминал @kemikofa.