2011-11-20 83 views
0

我想按公司名稱總結金額,但公司名稱的格式通常是不同的。如Apple Inc有時是蘋果電腦,Apple Inc. 另外..我不知道如何我可以處理「標題」Python CSV和SUM

我的文件格式是CSV。

company amount 
a 20 
b 10 
A' 30 
bb 20 

我想這樣做:

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

非常感謝你!文件是這樣的:公司,金額蘋果,300 Apple.inc,500蘋果電腦,1000 aa,750 bb,250 – user976856

+0

,但我不能做清單,因爲你已經做了... – user976856

+0

如果你事先不知道所有的名字,那麼您需要跟蹤輸入中包含的每個唯一名稱。如果你的輸入是Apple 10,Apple 20,Applebees 75,那麼你的輸出將有2個公司:Apple 30,Applebees 75.你必須決定是否將30和75加在一起作爲一個公司(就像蘋果公司一樣和蘋果電腦),或將它們分開成兩個不同的公司。 – 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多!但Python說「空在字符串」我不知道.. ohh – user976856

+0

我的意思是浮空() – user976856