Как преобразовать разделенную запятыми строку в массив - PullRequest
2 голосов
/ 05 февраля 2020

Я пытаюсь сделать массив из строки, а затем избавиться от кавычек, окружающих строки.

Это то, что я пытался:

hg = "'Erra', 'Erra-Network', 'Discovery'".split(",")
hg2 = hg.each { |n| n.delete_prefix("'").delete_suffix("'") }
print(hg2)

, но не ' t работа.

Вывод:

["'Erra'", " 'Erra-Network'", " 'Discovery'"]

Ответы [ 4 ]

4 голосов
/ 05 февраля 2020

Попробуйте map вместо each, он вернет новый обновленный массив:

hg = "'Erra', 'Erra-Network', 'Discovery'".split(",")
hg2 = hg.map { |n| n.delete_prefix("'").delete_suffix("'") }
print(hg2)

each будет выполняться для каждого элемента в массиве, но затем вернет исходный неизмененный массив , map фактически возвращает измененный массив: { ссылка }

1 голос
/ 05 февраля 2020

Вы работаете с hg, но затем печатаете hg2, чтобы проверить, успешно ли выполнена операция. Хотя это не проблема, это может привести к путанице.

Кроме того, поскольку вы используете delete_prefix и delete_suffix в их неразрушающих версиях, примененные изменения возвращают новый объект, который не ' t "сохраняется" в любом месте.

Если вы хотите увидеть изменения, которые вы производите, вы можете использовать их разрушительную версию delete_prefix!, delete_suffix!:

hg2 = hg.each do |n|
  n.delete_prefix!("'")
  n.delete_suffix!("'")
end

hg # ["Erra", " 'Erra-Network", " 'Discovery"]

Или, скорее, использовать карту и привести результат каждой операции в новый объект:

hg2 = hg.map { |n| n.delete_prefix("'").delete_suffix("'") }

p hg2 # ["Erra", " 'Erra-Network", " 'Discovery"]

Хотя это приводит к ["Erra", " 'Erra-Network", " 'Discovery"] и не go в соответствии с заголовком вопроса "удалить кавычки, окружающие строки ".

0 голосов
/ 05 февраля 2020

Вы можете использовать CSV для получения вашего результата:

require 'csv'

string = "'Erra', 'Erra-Network', 'Discovery'"
result = CSV.parse_line(string, col_sep: ', ', quote_char: "'")
#=> ["Erra", "Erra-Network", "Discovery"]

Обратите внимание, что в приведенном выше предположении разделитель равен ', '. Это означает, что запятая всегда должна сопровождаться пробелом.

0 голосов
/ 05 февраля 2020

Ты делаешь это слишком сложным. Я бы сделал это:

hg = "'Erra', 'Erra-Network', 'Discovery'"

hg.delete(" '").split(',') # => ["Erra", "Erra-Network", "Discovery"]

delete выполняет очистку, что следует сделать перед попыткой split строки.

delete_prefix и delete_suffix являются полезными методами, но не при обработке строк, которые вы анализируете, потому что они заставляют вас итеративно обрабатывать подстроки. delete выполняет всю строку за один шаг, что быстрее.

Если бы я собирался выполнить итерацию, я бы сделал что-то вроде этого:

hg.split(/, */).map { |s| s[1..-2] } # => ["Erra", "Erra-Network", "Discovery"]

, который использует split возможность использовать регулярное выражение для автоматического разбиения на запятую, за которой следует любое количество пробелов. В основном вы будете пытаться проанализировать искаженную запись CSV, поэтому вы должны использовать класс CSV . В документации есть много примеров для анализа записей:

require 'csv'
CSV.parse(hg.delete("' ")).flatten # => ["Erra", "Erra-Network", "Discovery"]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...