2011-11-20 4 views
0

회사 이름으로 금액을 합치고 싶지만 종종 회사 이름의 형식이 다릅니다 .. Apple Inc와 같은 경우가 있습니다 Apple 컴퓨터, Apple Inc. 또한 .. "헤더"를 처리 할 수 ​​있습니다파이썬 CSV 및 합계

내 파일 형식은 CSV입니다.

company amount 
a 20 
b 10 
A' 30 
bb 20 

I는 다음과 같이 할 싶습니다

line = readline() if line=='': 
break 
if 'Apple' in line: 
sum(amount) 
+0

CSV 파일의 처음 몇 줄을 게시해야합니다 – Triptych

답변

0

당신은 매핑 할 필요 해요을 각각의 이름을 개별적으로 합산하고 나중에 손으로 결합하거나 각 회사에서 사용하는 모든 별칭을 식별하는 사전을 만들어서 이름 변형을 어떻게 든 할 수 있습니다. if 'Apple' in line:은 다른 회사의 금액을 감지 할 수 없게 혼합 할 수 있기 때문에 열심히 실패합니다.

Company = {"Apple": 1, "Apple Computer": 1, "AAPL": 1, "Apple, Inc": 1, 
      "Apple Vacations": 2, "Applebee's Restaurant": 3 } 

sum[Company[name]] += amount 

편집 2 :

를 : 사전에 모든 회사 이름을 알 수없는 경우에, 당신이 할 수있는 최선은 입력 파일에 포함 된 고유 한 이름을 추적하고 나중에 병합할지 여부를 결정할 것입니다
Company = {} 
for <name, amount> in file: # pseudo-code for reading and parsing the input 
    if name in Company: 
     Company[name] += amount 
    else: 
     Company[name] = amount 
+0

정말 고마워요! 파일은 다음과 같습니다. 회사, 금액 Apple, 300 Apple.inc, 500 Apple Computer, 1000 aa, 750 bb, 250 – user976856

+0

그러나 내가 수행 한대로 목록을 만들 수는 없습니다 ... – user976856

+0

미리 모든 이름을 모르는 경우 , 입력에 포함 된 각 고유 이름을 추적해야합니다. 입력이 Apple 10, Apple 20, Applebees 75 인 경우 출력은 Apple 30, Applebees 75의 두 회사가됩니다. 30 대와 75 대를 하나의 회사로 추가할지 결정해야합니다 (Apple Apple Computer) 또는 두 개의 다른 회사로 분리하여 두십시오. – Dave

2

귀하의 데이터는 사실 CSV 형식이 아닙니다. 겉보기 열은 쉼표 나 탭 또는 단일 공백으로 구분되지 않습니다. 때로는 여러 공백이 있습니다 ... 공백 구분 값 파일 인 경우 각 공백은 새 열을 나타냅니다. 여러 개의 공백은 한 줄에 두 개 이상의 열이 있음을 의미합니다.

이 세부 정보는 CSV 파일이 csv module에 의해 쉽게 파싱되므로 중요합니다. 하지만이 파일은 실제 CSV 파일이 아니기 때문에 CSV 모듈을 사용할 수 없습니다.

는 항상 공백으로 구분 된 두 열이 있어야하고, 마지막 열은 (첫 번째 헤더 행 제외) 숫자 양 대표되는 가정하면 :

total=0 
with open('data.csv','r') as f: 
    next(f) # skip the first (header) line 
    for line in f: 
     company,amount=line.rsplit(' ',1) 
     amount=float(amount) 
     if 'Apple' in company: 
      total+=amount 
print(total) 
+0

sooo 고맙습니다. 하지만 파이썬은 "문자열에 비어있다"나는 잘 모르겠다. 오. – user976856

+0

플로트에서 비어 있다는 뜻입니다.() – user976856