[英]How to convert a comma-delimited string into an array
我正在尝试从字符串中创建一个数组,然后去掉字符串周围的引号。
这是我尝试过的:
hg = "'Erra', 'Erra-Network', 'Discovery'".split(",")
hg2 = hg.each { |n| n.delete_prefix("'").delete_suffix("'") }
print(hg2)
但不起作用。
输出:
["'Erra'", " 'Erra-Network'", " 'Discovery'"]
尝试map
而不是each
,它将返回一个新的更新数组:
hg = "'Erra', 'Erra-Network', 'Discovery'".split(",")
hg2 = hg.map { |n| n.delete_prefix("'").delete_suffix("'") }
print(hg2)
each
将对 Array 中的每个元素执行,但随后将返回原始未修改的 Array。 map
实际上返回修改后的数组: https : //stackoverflow.com/a/5254192/44733
您正在处理hg
,然后打印hg2
以检查操作是否成功。 虽然这不是问题,但它可能会导致混淆。
此外,当您在非破坏性版本中使用delete_prefix
和delete_suffix
时,应用的更改会返回一个新对象,该对象不会在任何地方“持久化”。
如果您想查看产生的更改,可以使用其破坏性版本delete_prefix!
, delete_suffix!
:
hg2 = hg.each do |n|
n.delete_prefix!("'")
n.delete_suffix!("'")
end
hg # ["Erra", " 'Erra-Network", " 'Discovery"]
或者更确切地说,使用 map 并将每个操作的结果生成到一个新对象中:
hg2 = hg.map { |n| n.delete_prefix("'").delete_suffix("'") }
p hg2 # ["Erra", " 'Erra-Network", " 'Discovery"]
尽管这会导致["Erra", " 'Erra-Network", " 'Discovery"]
并且不符合“删除字符串周围的引号”问题的标题。
你太难了。 我会这样做:
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 有许多选项可用于处理分隔符和带引号的字符串的奇怪变化,因此如果您想这样做,请研究文档。
您可以使用 CSV 来获取结果:
require 'csv'
string = "'Erra', 'Erra-Network', 'Discovery'"
result = CSV.parse_line(string, col_sep: ', ', quote_char: "'")
#=> ["Erra", "Erra-Network", "Discovery"]
请注意,以上假设分隔符是', '
。 这意味着逗号后面必须始终跟一个空格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.