【问题标题】:Remove empty value before converting string to array在将字符串转换为数组之前删除空值
【发布时间】:2015-03-16 17:55:25
【问题描述】:
ids = "1,4,5,"

ids.split(',') => ["1", " 4", " 5", " "]

ids.split(',').map(&:to_i) => [1, 4, 5, 0]

如何在它变为零之前删除该空值?

【问题讨论】:

  • 鉴于ids.split(',') 结果中的空格,您的原始ids 变量中必须有额外的空格。我猜它实际上是"1, 2, 3, "(每个逗号后有一个空格)?如果您拆分显示的内容,则不会获得该额外元素。请准确复制并粘贴您的代码以避免这种混淆。
  • 这看起来像是一个 XY 问题。您是否正在从文件中读取数据并询问如何处理各个行?如果是这样,请使用 CSV 类并省去您的麻烦。

标签: ruby arrays split


【解决方案1】:

你也可以使用#scan

ids = "1,4,5,"
ids.scan(/\d+/).map(&:to_i)
# => [1, 4, 5]

【讨论】:

  • 只要值是整数,这将起作用。如果有浮点或任何字符串元素,它将失败。
  • @theTinMan 那么我肯定会更改代码。这是根据 OP 的示例给出的。
  • 对,没错,但是在数据类型不同的情况下,split 将返回比scan 更有用的结果。
【解决方案2】:

这在 Ruby 2.2+ 中不会发生:

ids = "1,4,5,"
ids.split(',')
# => ["1", "4", "5"]

RUBY_VERSION # => "2.2.0"

简单的做法是在尝试处理数据之前对您的数据进行预检并将其规范化为应有的状态:

ids = "1,4,5,"

ids.chop! if ids[-1] == ','
ids # => "1,4,5"

ids.split(',')
# => ["1", "4", "5"]

您可以在测试中更加严格一些,因为行尾也可能包含会导致清理的空白。

此外,您正在处理逗号分隔的数据,因此请考虑使用内置的 CSV 类,该类旨在处理此类字符串。

【讨论】:

  • 我不知道这种变化,我很高兴看到。如果有人想知道,在 v.2.2 中我们仍然会收到 ",1,2,3".split(',') #=> ["", "1", "2", "3"]
  • 这是not new behaviour。引用文档:“如果省略了限制参数,则会抑制尾随的空字段。”
猜你喜欢
  • 2020-06-20
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多