2011-04-05 67 views
1

我正在使用Ruby 1.8和FasterCSV。如何使用紅寶石刪除重複的列FasterCSV

我讀的csv文件有幾個重複的列。

| acct_id | amount | acct_num | color | acct_id | acct_type | acct_num | 
|  345 | 12.34 |  123 | red |  345 | 'savings' |  123 | 
|  678 | 11.34 |  432 | green |  678 | 'savings' |  432 | 

...等

我想濃縮成:

| acct_id | amount | acct_num | color | acct_type | 
|  345 | 12.34 |  123 | red | 'savings' | 
|  678 | 11.34 |  432 | green | 'savings' | 

有沒有一種通用的方式來做到這一點?

目前我的解決辦法是這樣的:

headers = CSV.read_line(file) 
headers = CSV.read_line # get rid of garbage line between headers and data 
FasterCSV.filter(file, :headers => headers) do |row| 
    row.delete(6) #delete second acct_num field 
    row.delete(4) #delete second acct_id field 

    # additional processing on the data 
    row['color'] = color_to_number(row['color']) 
    row['acct_type'] = acct_type_to_number(row['acct_type']) 
end 
+1

是你有沒有工作? – 2011-04-05 19:23:00

+0

它可以工作,但並不高雅。例如。我有另一個不同索引表的類似問題。 – mkirk 2011-04-05 20:11:45

回答

1

假設你想擺脫硬編碼的缺失

row.delete(6) #delete second acct_num field 
    row.delete(4) #delete second acct_id field 

可以更換由

row = row.to_hash 

這會揍重複。發佈的代碼的其餘部分將繼續工作。

+0

但是然後散列的元素不一定與行的元素的順序相同。當我想打印出結果時,這是一個問題,因爲我的字段與標題不匹配 – mkirk 2011-04-05 20:09:20

+0

它們在Ruby 1.9中的順序相同。對於1.8.6,你需要手動指定輸出,我同意這種說法有悖於原因。 – steenslag 2011-04-05 20:21:43