как получить уникальные значения столбца Ruby CSV массив - PullRequest
0 голосов
/ 26 января 2020

У меня есть ruby объект csv следующим образом

[14] pry(main)> $importStocks[0..3]
=> [#<CSV::Row "Symbol":"B" "Name":"Barnes Group, Inc." "Exchange":"NYSE" "Sector":"Industrial" "Industry":"Industrial Suppliers" "SCTR":"76.7" "Universe":"sml" "Close":"64.880" "Volume":"112191">,
 #<CSV::Row "Symbol":"BA" "Name":"Boeing Co." "Exchange":"NYSE" "Sector":"Industrial" "Industry":"Aerospace" "SCTR":"1.8" "Universe":"lrg" "Close":"309.000" "Volume":"18769578">,
 #<CSV::Row "Symbol":"BAB" "Name":"Invesco Taxable Municipal Bond ETF" "Exchange":"NYSE" "Sector":"" "Industry":"" "SCTR":"33.3" "Universe":"etf" "Close":"32.180" "Volume":"151304">,
 #<CSV::Row "Symbol":"BABA" "Name":"Alibaba Group Holding Ltd." "Exchange":"NYSE" "Sector":"Consumer Discretionary" "Industry":"Broadline Retailers" "SCTR":"88.7" "Universe":"mid" "Close":"222.370" "Volume":"10031812">]

Я хочу получить только столбец Обмен значениями. как это сделать? как функция карты не работает?

[15] pry(main)> $importStocks.map(&:Exchange)
NoMethodError: undefined method `Exchange' for #<CSV::Row:0x0000000005aa76e8>
from (pry):15:in `map'
[16] pry(main)> $importStocks.map(&:"Exchange")
NoMethodError: undefined method `Exchange' for #<CSV::Row:0x0000000005aa76e8>
from (pry):16:in `map'

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Давайте сначала создадим файл CSV. Чтобы упростить, я включил только четыре из ваших полей. Я также изменил значение "Exchange" в одной строке с "NYSE" на "FTSE". Поскольку значение одного из полей "Name" содержит запятую, я сделал разделитель столбцов точкой с запятой, но, конечно, есть и другие варианты. Запятую можно использовать, если записи в столбце name заключены в кавычки.

fname = 't.csv'

File.write fname, <<~END
Symbol;Name;Exchange;Sector
B;Barnes Group, Inc.;NYSE;Industrial
BA;Boeing Co.;FTSE;Industrial
BAB;Invesco Taxable Municipal Bond ETF;NYSE;
BABA;Alibaba Group Holding Ltd.;NYSE;Consumer Discretionary
END
  #=> 200

Теперь мы просто используем CSV :: read с параметрами headers: true и col_sep: ';' для чтения файла в CSV :: Table объект:

require 'csv'

csv = CSV.read(fname, headers: true, col_sep: ';')
  #=> #<CSV::Table mode:col_or_row row_count:5>

и использование CSV :: table # [] для извлечения "Exchange" колонка:

csv["Exchange"] 
  #=> ["NYSE", "FTSE", "NYSE", "NYSE"] 
2 голосов
/ 26 января 2020

CSV::Row принимает сообщение field с именем поля в качестве аргумента. CSV :: Row.field

exchange_values = $import_stocks.map { |row| row.field("Exchange") }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...