2013-06-25 12 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列條目的行號第3行,第4行,第5行出現在它們之間。因此,行(1 & 2)和行(6 & 7)不應該組合在一起。因此,在輸出文件中,我應該得到類似於2 3 2 1 1 1 1的結果。還有一點是,第7行和第8行的順序號不同於1。因此,第8行應該被計爲單獨的條目,而不是與第6和第7行一起,儘管第6,7,8行具有相同的前兩列。
我希望大多數人都能理解這個問題。如果沒有,我會澄清這個問題。
正如你所看到的,這是一個非常複雜的問題。我嘗試使用字典,因爲這是我知道的唯一數據結構,但沒有邏輯工作。請幫我解決這個問題。

+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 ....偉大的你永遠是我的救世主。我更小的問題。假設每行有4列而不是3,第四列是一個整數。例如,由於line1和line2被分組在一起,因此可以說他們具有相同的第四列值。我怎樣才能提取/打印第四列值和計數? –

+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]