繁体   English   中英

如何将逗号分隔的字符串转换为数组

[英]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_prefixdelete_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_prefixdelete_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM