Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Работы с массивом


Автор: zsftp 5.4.2008, 12:18
Ruby начал изучать недавно.
В данный момент возник затык, никак немогу придумать даже алгоритм.

Имеется, к примеру, таблица биллинга вида:

Код

ipsrc            ipdst              bytes  psrc  pdst
217.65.6.13      192.168.1.8         7379     80 49736
217.65.6.13      192.168.1.8        42770     80 49736
217.65.6.13      192.168.1.8        31394     80 49736
217.65.6.13      192.168.1.8        32718     80 49736
192.168.1.8      217.65.6.13         1877  49736    80
192.168.1.8      217.65.6.13         4897  49736    80
192.168.1.8      217.65.6.13         4776  49736    80
192.168.1.8      217.65.6.13         5324  49736    80


Нужно скомпоновать ее по трафику, к виду:

Код

ipsrc            ipdst              bytes  psrc  pdst
217.65.6.13      192.168.1.8       114261     80 49736
192.168.1.8      217.65.6.13        16874  49736    80


Автор: shine 5.4.2008, 13:23
Что вы имеете ввиду под 'скомпоновать по трафику'? Если оба IP совпадают И оба порта совпадают, то байты складываем. Так?

Автор: zsftp 5.4.2008, 15:05
Да, Вы правы.
Но я немогу придумать, в каком виде в языке это хранить. В виде массивов многомерных или иначе?

Автор: shine 5.4.2008, 16:41
Я бы делал массив в котором каждый элемент является хэшем (Hash):
Код

irb(main):001:0> k = Array.new
=> []
irb(main):002:0> k[k.length] = {'bytes' => 114_261, 'psrc' => 80}
=> {"bytes"=>114261, "psrc"=>80}
irb(main):003:0> k[k.length] = {'bytes' => 114_261, 'psrc' => 80}
=> {"bytes"=>114261, "psrc"=>80}
irb(main):004:0> k
=> [{"bytes"=>114261, "psrc"=>80}, {"bytes"=>114261, "psrc"=>80}]

В хэшах вы сможете использовать строковые переменные как ключи, а в массивах ключи могут быть только числами.

Автор: zsftp 6.4.2008, 09:56
А каким образом делать привязку к ip адресам?

Автор: shine 6.4.2008, 10:31
Цитата(zsftp @ 6.4.2008,  09:56)
А каким образом делать привязку к ip адресам?

Да точно так же. Добавьте еще одну пару ключ+значение. Ключем будет 'ipsrc' а значением какой-нибудь IP из вашей таблицы. Так можно расширять этот хэш сколько вам будет нужно. 

Общий смысл в том, что каждая строка в таблице будет соответствовать элементу массива, а каждое значение в этой строке будет хранится в ячейке хэша с ключем таким же, как и название столбца в таблице.

Автор: popolzen 7.4.2008, 04:47
Можешь попробовать сделать таким образом:

Код

regexp = /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d+)\s+(\d+)\s+(\d+)$/

stats = Hash.new(0)

open('filename').read.scan(regexp) {|ipsrc, ipdst, bytes, psrc, pdst|
  stats[[ipsrc, ipdst, psrc, pdst]] += bytes.to_i
}


На выходе получаешь хэш, в котором ключами будет массив (ipsrc, ipdst, psrc, pdst), а значениями суммарный объем трафика.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)