2012-10-04 2 views
1
난 내 자신에 대한 몇 가지 파이썬 코딩을 배우려고 노력하고

을 기반으로 나는이 문제 ::문자열 그룹화 이름

입력 텍스트 파일 내용 :

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를 사용하거나 이미 생성하고 값 열을 집계하는 collections.defaultdictcsv.reader 객체의 사용을 만들 수 ...

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

더 복잡한 교차 도표화/피벗 등 ... 다음은 매우 유용한 라이브러리 인 을 살펴볼 가치가 있습니다. numpy

+1

안녕하세요 덕분에 많은 노력을했지만 내 파일은 유니 코드 파일입니다. 첫 번째 문자를 파싱 한 후 null 바이트를 반환합니다. 어떤 제안. – 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

1

csv을 사용하여 파일을 읽으십시오. 정렬 후 행을 그룹화하려면 itertools.groupby()을 사용하십시오. sum()을 사용하여 generator expression을 통해 그룹화 된 행의 각 값을 합산하십시오. 당신이보고있는 경우