Прочтите файл журнала в R, чтобы каждая строка начиналась с отметки времени - PullRequest
5 голосов
/ 06 августа 2020

У меня есть файл журнала с такими данными внутри:

2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 10 - Trying to upload data
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 66 - Trying to upload data
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidationXmlParser: 127 - No META-Only annotation
2020-07-28 14:48:00 (pool-2-thread-1id) DEBUG MessageWriter: 55 - Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={
  "errors": [
    "Message type error"
  ]
})) to exchange FOS 
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578 - Scoped message interpolator.

Я пытаюсь прочитать этот файл таким образом:

data <- readr::read_lines(file = "log_data.log", progress = FALSE)
log_df <- setDT(tibble::enframe(data, name = NULL))

Но этот фрейм данных выглядит так:

              value
1   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 10 - Trying to upload data
 
2   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 66 - Trying to upload data
3   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidationXmlParser: 127 - No META-Only annotation
4   2020-07-28 14:48:00 (pool-2-thread-1id) DEBUG MessageWriter: 55 - Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={
5     "errors": [
6         "Message type error"
7     ]
8   })) to exchange FOS 
9   2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578 - Scoped message interpolator.

Итак, поскольку вы видите строку номер 4, разделенную на несколько строк, подумал, что это одна. Как я мог прочитать этот файл журнала, чтобы он понимал, что каждая строка должна начинаться с отметки времени? Следует ли мне как-то использовать регулярные выражения?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

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

log_string <- '2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 10 - Trying to upload data
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 66 - Trying to upload data
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidationXmlParser: 127 - No META-Only annotation
2020-07-28 14:48:00 (pool-2-thread-1id) DEBUG MessageWriter: 55 - Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={
  "errors": [
    "Message type error"
  ]
})) to exchange FOS 
2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578 - Scoped message interpolator.'

readr::read_lines(
    stringr::str_replace_all(
        log_string,
    
        # Regular expression
        '(\\r?\\n|\\r)(?!\\d{4}-(\\d{2}[-: ]){5})', '')
)

[1] "2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 10 - Trying to upload data"                                                                                                                                                                                                                      
[2] "2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ResourceLoaderHelper: 66 - Trying to upload data"                                                                                                                                                                                                                      
[3] "2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidationXmlParser: 127 - No META-Only annotation"                                                                                                                                                                                                                    
[4] "2020-07-28 14:48:00 (pool-2-thread-1id) DEBUG MessageWriter: 55 - Send message ErrorOutputMessage(super=NotificationOutputMessage(super=OutputMessage(type=null, messageId=116345, reqId=af24112))), error=ErrorOutputMessage.Error(code=400, text={  \"errors\": [    \"Message type error\"  ]})) to exchange FOS "
[5] "2020-07-28 10:07:01 (pool-3-thread-5id) DEBUG ValidatorFactoryImpl: 578 - Scoped message interpolator."

(\\r?\\n|\\r) соответствует различным версиям новой строки.

(?!\\d{4}-(\\d{2}[-: ]){5}) - это отрицательный просмотр вперед, который соответствует дате и времени (скопировано из ответа EvilSmurf).

0 голосов
/ 06 августа 2020

да, я думаю, что регулярное выражение было бы хорошим способом go

какой язык программирования вы используете?

в формате python выражение будет примерно таким:

\d{4}-(\d{2}[-: ]){5}(?P<your_data>[\s\S]*?)(?=\s*(\d{4}-(\d{2}[-: ]){5}|$))

Я сделал вам пример здесь

ОБНОВЛЕНИЕ:

, если вы действительно хотите сопоставить только строки с метками времени вы можете упростить шаблон регулярного выражения до этого:

\d{4}-(?:\d{2}[-: ]){5}[^\n]*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...