2017-10-24 2 views
0

로그 파일을 읽고 분석하고 싶습니다. 불행히도 파일은 상당히 "못생긴"방식으로 저장됩니다 (중간에 특수 문자가 많이 포함되어 있음). 그래서 각 행이 하나의 항목으로 읽히지 않습니다. 서로 다른 항목을 구분하는 유일한 방법은 정규 표현식을 사용하는 것입니다. 각 항목의 시작 부분이 지정된 패턴을 따르기 때문입니다.R - 정규 표현식을 사용하여 문자 벡터 분할

첫 번째 방법은 문자 벡터에서 패턴을 식별하고 (필자는 판독기 패키지에서 read_file을 사용함) 해당 위치를 사용하여 벡터를 strsplit과 분리하는 것입니다. 불행히도 결과가 항상 항목에 해당하지 않기 때문에 위치가 항상 일치하지 않는 것 같습니다 (특수 문자에 문제가있는 것 같음). 이것은 해당 정규 표현식으로 보이는 여기에 일반적인 항목

입니다 : - 조지

16/10/2017, 21시 51분는 다음과 같이

파일의 전형적인 라인이 보인다 다음 : 내가 원하는

([[:digit:]]{2})/([[:digit:]]{2})/([[:digit:]]{4}), ([[:digit:]]{2}):([[:digit:]]{2}) - ([[:alpha:]]+): 

우선 각 줄은 나는 그것의 다른 파에 패턴을 분할 거라고 다음 단계에서 (특정 항목에 해당와 data.frame입니다 ts). 이 로그 파일을 볼 수 있습니다

regex.log = "([[:digit:]]{2})/([[:digit:]]{2})/([[:digit:]]{4}), ([[:digit:]]{2}):([[:digit:]]{2}) - ([[:alpha:]]+):" 
log.regex = gregexpr(regex.log, file.log)[[1]] 
log.splitted = substring(file.log, log.regex, log.regex[2:355]-1) 

으로

355 개 항목이 있습니다 : 내가 지금까지 시도 무엇

는 다음이었다. 첫 번째 것들은 정확하게 분리되어 있습니다. 정규 표현식/패턴의 정보를 잃지 않고 정규 표현식을 사용하여 문자 벡터를 분리하려면 어떻게해야합니까?

+0

을 (regex.log, 파일 .log)'와''gsub (regex.log, "", file.log)'를 사용하여 텍스트를 추출합니다. – Jthorpe

답변

2

를 사용하여 캡처 및 비 캡처 유지하려는 부분을 식별하고, 앵커 사용해야하는 그룹 : 난 당신이 grepl`의 조합을 사용하려는 생각

file.log = "16/10/2017, 21:51 - George: This is a typical entry here" 
regex.log = "^((?:[[:digit:]]{2})\\/(?:[[:digit:]]{2})\\/(?:[[:digit:]]{4}), (?:[[:digit:]]{2}):(?:[[:digit:]]{2}) - (?:[[:alpha:]]+)): (.*)$" 

gsub(regex.log,"\\1",file.log) 
>> "16/10/2017, 21:51 - George" 
gsub(regex.log,"\\2",file.log) 
>> "This is a typical entry here" 
+0

답변 해 주셔서 감사합니다. 정규 표현식에서 변경 한 내용을 설명해 주시겠습니까? –

+0

정규식을 이해하려면 [regex101.com]을 사용하는 것이 좋습니다. 더블 슬래시는 단 하나의 문자열을 R로 전달하기위한 것이기 때문에 가장 좋은 설명이 될 것입니다. (이중 슬래시''\\ "'를 단일''\"'로 변환하는 것을 잊지 마십시오. (': blah blah blah)'로 여러분의 그룹을'(blah blah blah)'로 만든 다음, 내가 원하는 표현의 두 부분을 자신의 그룹으로 감싸서 대체 표현에 사용할 수 있도록했습니다 (' "\\ 1"') – Jthorpe

+0

고마워요. 코드가 작동하지만, 불행히도 내가 가지고있는 파일에서 작동하지 않습니다. 현재 문제가있는 곳을 찾으려고합니다. –

관련 문제