2012-10-04 102 views
1

我想了解我自己的一些Python代碼,我通過這個問題::字符串分組基於名稱

輸入文本文件的內容::

10280341|2012-10-03 19:11:06.390|Sami|abc|Crossword|70 
10280343|2012-10-03 19:15:32.173|Sami|aaa|Sudoku|30 
10280355|2012-10-04 19:18:32.173|miami|bbb|Chaircar|15 
10280366|2012-10-04 19:19:32.173|miami|bob|Avista|35 

總產值有望::

來到
2012-10-03 Sami|2|100 
2012-10-04 miami|2|50 

我知道這可以通過字符串解析來完成&匹配但我沒有任何想法,從哪裏開始。任何鏈接或指針都會對任何類似問題有很大的幫助。 TIA

回答

1

你可以使用itertools.groupby作爲已經提出,或利用csv.reader對象這已經是一個發電機和一個collections.defaultdict聚集值列...

import csv 
from collections import defaultdict 

summary = defaultdict(list) 
csvin = csv.reader(open('testdata.txt'), delimiter='|') 
for row in csvin: 
    summary[(row[1].split(' ')[0], row[2])].append(int(row[5])) 

csvout = csv.writer(open('testdata.out','wb'), delimiter='|') 
for who, what in summary.iteritems(): 
    csvout.writerow([' '.join(who), len(what), sum(what)]) 

如果你正在尋找更復雜的交叉製表/旋轉等...,那麼它可能是值得看看pandas這是一個非常有用的庫基於numpy

+1

嘿非常感謝它的工作,但我的文件是一個Unicode文件。它在解析第一個字符後返回一個空字節。有什麼建議麼。 – user1720510

+0

假設還有一行 ** 10280343 | 2012-10-05 19:15:32.173 | Sami | aaa | Sudoku | 30 ** 它應該按日期分組 例如: - ** 2012-10- 03 Sami | 2 | 100 ** ** 2012-10-04 miami | 2 | 50 ** ** 2012-10-05 Sami | 1 | 30 ** – user1720510