2013-06-25 4 views
0

나는 여러 번 시도해도 이상한 질문에 직면하고 있습니다. 문제의 논리와 적절한 코드를 찾을 수 없습니다.파일의 항목을 동적으로 계산하는 어려운 방법

나는 아래의 형식으로 파일이 있습니다

aa:bb:cc dd:ee:ff 100 ---------->line1 
aa:bb:cc dd:ee:ff 101 ---------->line2 
dd:ee:ff aa:bb:cc 230 ---------->line3 
dd:ee:ff aa:bb:cc 231 ---------->line4 
dd:ee:ff aa:bb:cc 232 ---------->line5 
aa:bb:cc dd:ee:ff 102 ---------->line6 
aa:bb:cc dd:ee:ff 103 ---------->line7 
aa:bb:cc dd:ee:ff 108 ---------->line8 
dd:ee:ff aa:bb:cc 233 ---------->line9 
gg:hh:ii jj:kk:ll 450 ---------->line10 
jj:kk:ll gg:hh:ii 600 ---------->line11 

내 프로그램 라인으로 파일 라인을 읽어야합니다. 첫 번째 줄과 두 번째 줄에서 해당 column1과 column2 값은 같습니다. 세 번째 열은 두 행에서 동일하지 않은 시퀀스 번호입니다.
line1과 line2는 같기 때문에 순서 번호는 1의 값만 다르므로 먼저 두 줄을 읽고 출력 파일에 개수를 2로 써야합니다. 우리가 관찰하면, 6 행과 7 행은 일련 번호가 연속 된 1 행과 2 행과 동일하지만 행 1과 2가 서로 다른 행 번호 line3, line4, line5가 그 사이에옵니다. 따라서 라인 (1 & 2)과 라인 (6 & 7)은 함께 그룹화되어서는 안됩니다. 그래서 출력 파일에서 나는 2 3 2 1 1 1 1과 같은 결과를 얻어야한다. 그리고 한 가지 더, 라인 7과 8은 시퀀스 번호가 1보다 다르다. 따라서 라인 8은 별도의 엔트리로 계산되어야한다. 6,7,8 행은 처음 두 행이 같지만 6, 7 행과 함께 사용하지 마십시오.
대부분의 사람들이이 질문을 이해하기를 바랍니다. 그렇지 않다면 나는 그 질문에 대해 무엇이든 명확히 할 것이다.
이것은 매우 복잡한 문제입니다. 내가 아는 유일한 데이터 구조로 사전을 사용하여 시도했지만 논리가 작동하지 않습니다. 이 문제를 해결하도록 도와주세요.

+3

어디에도 질문이 표시되지 않습니다. – Stephan

+0

@Stephan 질문은 내가 언급 한 것처럼 출력 파일을 어떻게 생성합니까? –

+0

@ JustinCarrey 질문을 다시 한 번 더 노골적인 말로 바꾸십시오. – 2rs2ts

답변

1
with open("abc") as f: 
    #read the first line and set the number from it as the value of `prev` 
    num, col4 = next(f).rsplit(None,2)[-2:] #use `str.rsplit` for minimum splits 
    prev = int(num) 
    col4_prev = col4 
    count = 1        #initialize `count` to 1 
    for lin in f: 
     num, col4 = lin.rsplit(None,2)[-2:] 
     num = int(num)      
     if num - prev == 1:    #if current `num` - `prev` == 1 
      count+=1      # increment `count` 
      prev = num      # set `prev` = `num` 
     else: 
      print count,col4_prev  #else print `count` or write it to a file 
      count = 1      #reset `count` to 1 
      prev = num      #set `prev` = `num` 
      col4_prev = col4 

    if num - prev != 1: 
     print count,col4 

출력 :

2 400 
3 600 
2 400 
1 111 
1 500 
1 999 
1 888 

'ABC는'포함하는 경우 : 먼저 열고 : 그것을해야

aa:bb:cc dd:ee:ff 100 400 
aa:bb:cc dd:ee:ff 101 400 
dd:ee:ff aa:bb:cc 230 600 
dd:ee:ff aa:bb:cc 231 600 
dd:ee:ff aa:bb:cc 232 600 
aa:bb:cc dd:ee:ff 102 400 
aa:bb:cc dd:ee:ff 103 400 
aa:bb:cc dd:ee:ff 108 111 
dd:ee:ff aa:bb:cc 233 500 
gg:hh:ii jj:kk:ll 450 999 
jj:kk:ll gg:hh:ii 600 888 
+0

@Ashwini .... 위대한 당신은 항상 나의 구세주입니다. 나는 더 작은 질문이다. 각 행에 3 대신 4 개의 열이 있고 4 번째 열에 정수가 있다고 가정하십시오. 예를 들어, line1과 line2가 함께 그룹화되어 있기 때문에 동일한 4 열 값을 가질 수 있습니다. 어떻게 카운트와 함께 4 번째 열 값을 추출/인쇄 할 수 있습니까? –

+0

@JustinCarrey 내 업데이트 된 솔루션을 참조하십시오. 그게 니가 원하는거야? –

+0

@ Ashwini .. 아니, 이쪽이 아니야.예를 들어, 처음 두 줄에 aa : bb : cc dd : ee : ff 100 400; aa : bb : cc dd : ee : ff 101 400, 어떻게 인쇄 할 것인가, 4 번째 열; 이 경우 2 400 –

0
from collections import defaultdict 
results = defaultdict(int) 
for line in open("input_file.txt", "r"): 
    columns = line.split(" ") 
    key = " ".join(columns[:2]) 
    results[key] += 1 

with output_file = open("output_file.txt", "w"): 
    for key, count in results: 
     output_file.write("{0} -> {1}".format(key, count)) 
0
entries = open('filename.txt', 'r') 
prevLine = "" 
count = 1 
for line in entries: 
    if line == prevLine: 
     count += 1 
    else: 
     print count 
     count = 1 
    prevLine = line 

, 여기에 대한 설명입니다 그 파일 다음에 파일의 각 행에 대해 을 반복하면 이전 행과 비교됩니다. 이전 행과 같으면 일치 카운터 을 하나 추가하면 인쇄되지 않습니다. 루프의 끝에서 출력과 카운터 를 재설정 당신은 인쇄 이전 라인

0

당신은 itertools.groupby() ...

from cStringIO import StringIO 
import itertools 

data = 'aa:bb:cc dd:ee:ff 100\n' \ 
     'aa:bb:cc dd:ee:ff 101\n' \ 
     'dd:ee:ff aa:bb:cc 230\n' \ 
     'dd:ee:ff aa:bb:cc 231\n' \ 
     'dd:ee:ff aa:bb:cc 232\n' \ 
     'aa:bb:cc dd:ee:ff 102\n' \ 
     'aa:bb:cc dd:ee:ff 103\n' \ 
     'aa:bb:cc dd:ee:ff 108\n' \ 
     'dd:ee:ff aa:bb:cc 233\n' \ 
     'gg:hh:ii jj:kk:ll 450\n' \ 
     'jj:kk:ll gg:hh:ii 600\n' 

sio = StringIO(data) 
print [len(list(g)) for k, g in itertools.groupby(sio, key=lambda x, c=itertools.count(): (x[:-5], int(x[-4:-1])-next(c)))] 

를 사용할 수 있습니다 ... ... 저장

[2, 3, 2, 1, 1, 1, 1] 
,536,
관련 문제