Элегантный, простой Ruby способ gsub! / Sub!значения в массиве / хэш со значениями в другом, когда на входе? - PullRequest
0 голосов
/ 25 февраля 2019

Я конвертирую входные данные, которые в идеале всегда имеют следующую строку внутри:

本 資料 由 (上市 公司) «Название компании в китайских иероглифах« 公司 提供

До сих порУ меня есть следующее:

input = gets

input.gsub!(/(本資料由\(上市公司\))(.{1,10})(公司提供)/)  {"
The following information has been provided by: #{$2}\n"}

Company_making_the_Announcement = /(The following information has been provided by: )(.+)/.match(input)

if Company_making_the_Announcement[2].match "如興"
input.gsub! Company_making_the_Announcement[2], "Roo Hsing Co., Ltd (TSEC:4414)"

elsif Company_making_the_Announcement[2].match "新潤"
input.gsub! Company_making_the_Announcement[2], "Shin Ruenn development Co., LTD. (GTSM:6186)"

elsif Company_making_the_Announcement[2].match "遠東商銀"
input.gsub! Company_making_the_Announcement[2], "Far Eastern International Bank Ltd. (TSEC:2845)"

end

Приведенный выше код работает просто отлично, но он немного неуклюжий, тем более что список компаний исчисляется тысячами, а код будет увеличиваться по мере того, как я добавляю новую компанию.Таким образом, я думал о более эффективном и элегантном способе сделать это.Я думал, что работа с массивами / хешами может помочь, но мне не повезло, так как приведенный ниже код продолжает возвращать ошибки, независимо от того, как я изменяю это:

companieslist = [{chin: '如興', eng: 'Roo Hsing Co., Ltd (TSEC:4414)' }, {chin: '新潤', eng: 'Shin Ruenn development Co., LTD. (GTSM:6186)' }]

Company_making_the_Announcement = /(The following information has been provided by: )(companieslist[:chin])/.match(input) 

If Company_making_the_Announcement[2].match (companieslist[:chin])
Input.gsub! Company_making_the_Announcement[2], (companieslist[:eng])

end

Итак, вкратце, что быбыть эффективным способом сопоставить значения в массиве (китайские имена) со значениями в другом (английские имена) и заменить первое значение на второе, когда они появляются во входных данных?

Большое спасибо

1 Ответ

0 голосов
/ 25 февраля 2019

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

companies = {'如興': 'Roo Hsing Co., Ltd (TSEC:4414)', '新潤': 'Shin Ruenn development Co., LTD. (GTSM:6186)' }

input = "如興 blah blah blah"

companies.each do |k,v|
  input.gsub!("#{k}", "#{v}")
end

puts(input)
# Roo Hsing Co., Ltd (TSEC:4414) blah blah blah

Обратите внимание, что предполагается, что вы хотите перевести каждый экземпляр каждого китайского названия компании на месте.Если названия компаний совпадают, вам потребуется немного другой подход.

...