2013-04-02 3 views
1

나는 파이썬에서 다음과 같은 작업을하고 있으며, 또한 bash 스크립팅을 사용하고있다. 파이썬에서 더 쉬운 방법이 없다면.파이썬 스크립트로 검색 결과를 .csv 파일로 내보내기

나는처럼 보이는 데이터와 로그 파일이 다음

16:14:59.027003 - WARN - Cancel Latency: 100ms - OrderId: 311yrsbj - On Venue: ABCD 
16:14:59.027010 - WARN - Ack Latency: 25ms - OrderId: 311yrsbl - On Venue: EFGH 
16:14:59.027201 - WARN - Ack Latency: 22ms - OrderId: 311yrsbn - On Venue: IJKL 
16:14:59.027235 - WARN - Cancel Latency: 137ms - OrderId: 311yrsbp - On Venue: MNOP 
16:14:59.027256 - WARN - Cancel Latency: 220ms - OrderId: 311yrsbr - On Venue: QRST 
16:14:59.027293 - WARN - Ack Latency: 142ms - OrderId: 311yrsbt - On Venue: UVWX 
16:14:59.027329 - WARN - Cancel Latency: 134ms - OrderId: 311yrsbv - On Venue: YZ 
16:14:59.027359 - WARN - Ack Latency: 75ms - OrderId: 311yrsbx - On Venue: ABCD 
16:14:59.027401 - WARN - Cancel Latency: 66ms - OrderId: 311yrsbz - On Venue: ABCD 
16:14:59.027426 - WARN - Cancel Latency: 212ms - OrderId: 311yrsc1 - On Venue: EFGH 
16:14:59.027470 - WARN - Cancel Latency: 89ms - OrderId: 311yrsf7 - On Venue: IJKL 
16:14:59.027495 - WARN - Cancel Latency: 97ms - OrderId: 311yrsay - On Venue: IJKL 

내가 각 라인에서 마지막 항목을 추출하고 각각의 고유 한 항목을 사용하여 모든 라인을 검색 할 필요가 나타나는지 .csv 파일로 내 보냅니다.

각 고유 항목을 얻으려면 다음 bash 스크립트를 사용했습니다. cat LogFile_ date +%Y%m%d .msg.log | awk '{print $ 14}'| 정렬 | 같은 로그에 그 결과 각각에 대해 내가 검색하고 싶은

이제
ABCD 
EFGH 
IJKL 
MNOP 
QRST 
UVWX 
YZ 

(또는 그렙) : UNIQ 로그 파일에 위의 데이터를 기준으로

, bash는 스크립트는 다음과 같은 결과를 반환 파일을 열어 상위 10 개의 결과를 반환하십시오. 나는 이것을하기 위해 또 다른 bash 스크립트를 가지고있다. 그러나 이것을 어떻게 사용 하는가? 따라서 x의 경우 x = 위의 각 항목

grep x LogFile_ date +%Y%m%d .msg.log | awk '{print $ 7}'| 정렬 -nr | 유니크 | 머리 -10

그런 다음 결과를 .csv 파일로 반환하십시오. 결과는 (별도의 열에 각 필드)과 같을 것이다 :

Column-A Column-B Column-C Column-D 
ABCD  2sxrb6ab Cancel 46ms 
ABCD  2sxrb6af Cancel 45ms 
ABCD  2sxrb6i2 Cancel 63ms 
ABCD  2sxrb6i3 Cancel 103ms 
EFGH  2sxrb6i4 Cancel 60ms 
EFGH  2sxrb6i7 Cancel 60ms 
IJKL  2sxrb6ie Ack  74ms 
IJKL  2sxrb6if Ack  74ms 
IJKL  2sxrb76s Cancel 46ms 
MNOP  vcxrqrs5 Cancel 7651ms 

내가 파이썬에서 초보자 해요 및 (십삼년 전) 대학 이후 많은 코딩을 수행하지 않았습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사.

+0

출력이 입력 내용과 어떻게 일치합니까? –

답변

1

파일을 열 었다고합시다.

from collections import defaultdict 

entries = defaultdict(list) 
for line in your_file: 
    # Parse the line and return the 'ABCD' part and time 
    column_a, timing = parse(line) 
    entries[column_a].append(timing) 

이 완료되면, 당신은 사전 등이있다 : 당신이하고 싶은 각각의 항목은 각 항목이 하나 이상의 타이밍 발생합니다, 말할 수있는, 거기에 얼마나 많은 시간 기록이다 그래서 : 당신이 지금 할 수있는 것들

{ 'ABCD': ['30ms', '25ms', '12ms'], 
    'EFGH': ['12ms'], 
    'IJKL': ['2ms', '14ms'] } 

은 (목록입니다) 값의 len 주문한 다른 데이터 구조로이 사전을 변환합니다. 예 : 물론

In [15]: sorted(((k, v) for k, v in entries.items()), 
       key=lambda i: len(i[1]), reverse=True) 
Out[15]: 
[('ABCD', ['30ms', '25ms', '12ms']), 
('IJKL', ['2ms', '14ms']), 
('EFGH', ['12ms'])] 

이것은 단지 예시하고 원래 for 루프에서 좀 더 많은 데이터를 수집 할 수 있습니다.

0

당신이 생각하는 것처럼 간결하지 않을 수도 있습니다 ... 그러나 이것이 당신의 문제를 해결할 수 있다고 생각합니다. 실제 데이터를보다 효과적으로 처리하기 위해 몇 가지 시도를 추가합니다.

import re 
import os 
import csv 
import collections 

# get all logfiles under current directory of course this pattern can be more 
# sophisticated, but it's not our attention here, isn't it? 
log_pattern = re.compile(r"LogFile_date[0-9]{8}.msg.log") 
logfiles = [f for f in os.listdir('./') if log_pattern.match(f)] 

# top n 
nhead = 10 
# used to parse useful fields 
extract_pattern = re.compile(
    r'.*Cancel Latency: ([0-9]+ms) - OrderId: ([0-9a-z]+) - On Venue: ([A-Z]+)') 
# container for final results 
res = collections.defaultdict(list) 

# parse out all interesting fields 
for logfile in logfiles: 
    with open(logfile, 'r') as logf: 
     for line in logf: 
      try: # in case of blank line or line with no such fields. 
       latency, orderid, venue = extract_pattern.match(line).groups() 
      except AttributeError: 
       continue 
      res[venue].append((orderid, latency)) 

# write to csv 
with open('res.csv', 'w') as resf: 
    resc = csv.writer(resf, delimiter=' ') 
    for venue in sorted(res.iterkeys()): # sort by Venue 
     entries = res[venue] 
     entries.sort() # sort by OrderId 
     for i in range(0, nhead): 
      try: 
       resc.writerow([venue, entries[i][0], 'Cancel ' + entries[i][1]]) 
      except IndexError: # nhead can not be satisfied 
       break 
+0

아마도 간단 할 지 모르지만 오류가 발생합니다. 로그 (logfile, 'r')를 사용하여 로그 : ^ 구문 오류 : 잘못된 구문 – user2234571

+0

도움을 주신 Francis Chan에게 감사드립니다. 이것은 잘 작동했습니다. .csv 파일의 각 열에 해당 제목을 사용하여 각 열을 쓰는 방법이 있습니까? 이제는 4 개의 모든 필드를 같은 열 (A 열)에 쓰고 있습니다. 또한, 나는 장소에 따라 알파벳 순으로 정렬하고 네 번째 필드 (63ms, 64ms, 63ms, 62ms ... 등)로 정렬하려고 했습니까? 다시 귀하의 도움은 정말로 감사하겠습니다. – user2234571

+0

또한, 필자는 로그 파일의 더 나은 예를 사용 했어야합니다. '대기 시간'에는 두 가지 유형이 있지만 '취소'유형 중 하나만 보여 줬습니다. 실제로는 "Cancel"또는 "Ack"입니다. 대기 시간 전에 올바른 단어를 어떻게 넣을 수 있습니까? 16 : 14 : 59.027003 - WARN - Ack 대기 시간 : 22ms - 주문 ID : 311yrsbj - 장소 : ABCD 16 : 14 : 59.027010 - 경고 대기 시간 : 22ms - 주문 ID : 311yrsbl - 장소 : EFGH 16 : 14 : 59.027201 - WARN - Ack 대기 시간 : 22ms - OrderId : 311yrsbn - 장소 : IJKL 16 : 14 : 59.027235 - WARN - 대기 지연 : 22ms - 주문 ID : 311yrsbp - 장소 : MNOP – user2234571

관련 문제