티스토리 뷰

반응형

네이버 지식인에서 줏은 문제이다. 텍스트 파일에 상당히 많은 양의 데이터가 있다. (내용으로보건데 특정한 기기의 로그 파일인 것 같다.) 해당 데이터로부터 ID, distance, spd 값을 추출하여 distance가 특정 범위 이내 일 때 SPD의 평균값을 구하고 싶다는 것이 요지이다.


일단 로그 데이터는 아래와 같은 포맷의 텍스트파일이다.

[2017-08-05 00:10:00.043] a.b.senser - lader> system:
[2017-08-05 00:10:00.043] a.b.senser - lader> ID: 1, distance: 137, spd: -40
[2017-08-05 00:10:00.043] a.b.senser - lader> ID: 2, distance: 155, spd: -34

이 파일에서 ID: 값, distance: 값, spd: 값의 형태를 취하는 라인들을 추려내기만 하면 되기 때문에 사실 매우 간단한 문제이다. 우선 패턴을 만들어보면 다음과 같다.


import re

pat = re.compile(r'ID: (\d+), '
                 r'distance: (\d+), '
                 r'spd: ([0-9\-\+]+)'
                )

search()를 이용해서 패턴에 각 라인을 매칭하고, 매칭에 성공하면 groups()를 이용해서 각 그룹이 추출된 튜플을 얻을 수 있는데, 이 각각의 값을 정수값으로 만들어서 각 변수에 나눠담으면 된다.

파일을 열고 라인을 처리하기 전에, 센서의 id 별로 spd 값을 모아둘 사전 데이터를 하나 만든다.


data = dict()

다음은 라인처리


with open('test.txt', encoding='utf8') as f:
  for line in f:
    matched = pat.search(line)
    ## 매칭에 실패한 라인은 건너뛴다.
    if not matched:
      continue
    _id, distance, spd = [int(x) for x in matched]
    ## 거리에 따른 필터링
    if 0 <= distance <= 100:
      data.setdefault(_id, []).append(spd)

최종적으로 센서 ID 별 평균 SPD를 구하는 것은 간단하다.


for k, v in data.items():
  avg = sum(v) / len(v)
  print("id: {}, avg SPD: {}".format(k, avg))

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함