【问题标题】:How to split a String in a multidimensional Array in ruby?如何在 ruby​​ 中拆分多维数组中的字符串?
【发布时间】:2017-07-20 11:22:05
【问题描述】:

我在 Ruby 中有一个多维数组,如下所示:

[["2013-08-22 13:23:12 +0212", 100, 1], ["2013-09-22 14:25:12 +0123" , 123, 1]]

我想将第一个数组位置的字符串和时间拆分为小时、分钟和秒(并将这些转换为整数),所以它会变成:

[["2013-08-22", 13, 23, 12, "+0212", 100, 1], [.....]]

有人知道如何解决这个问题吗?

【问题讨论】:

  • 我的问题是,您是如何到达起点的?也许可以避免在多维数组中使用日期时间的字符串表示形式,并且可以更优雅地实现。
  • 这些是传真机生成的数据,以json格式保存。总的来说,我有一个包含 52000 个上述数组的数组......我必须将它们转换为请求的格式,以便我可以处理它们。
  • 所以你有 JSON -> 多维数组 -> 你想要的数组 -> 处理过的数组。假设您从 API 获取 JSON,我认为您可以创建一个跳过一些中间步骤的传真客户端。
  • 请将您认为最有帮助的答案标记为正确。

标签: ruby string multidimensional-array split


【解决方案1】:

如果你想要更多的可读性,我建议这样做:

require 'date'
array = [["2013-08-22 13:23:12 +0212", 100, 1], ["2013-09-22 14:25:12 +0123" , 123, 1]]
array.map do |date_time, a, b|
  date_time = DateTime.parse(date_time)

  [
    date_time.strftime('%F'), date_time.hour, date_time.min,
    date_time.sec, date_time.strftime('%z'), a, b
  ]
end

它非常清楚结果数组的每个元素是什么。如果您有 ab,则应将它们替换为有意义的名称。

【讨论】:

  • 这看起来很不错,虽然你丢失了"+0212" 字符串。顺便说一句,您需要将每个d 更改为date_time。 :)
  • 点赞这个。 Ruby 有一种解析日期时间的规范方法,所以我们应该使用它,而不是重新发明它。
  • 谢谢!你们知道date_time.to_date.to_sdate_Time.zone.to_s.gsub(':', '') 的更好方法吗?那是我不太喜欢的两件作品。最好在创建返回值之前将它们提取到单独的变量中。
  • 当然,您可以使用formats。分别为date_time.strftime('%F')date_time.strftime('%z')
【解决方案2】:
[["2013-08-22 13:23:12 +0212", 100, 1],
 ["2013-09-22 14:25:12 +0123" , 123, 1]].

   map do |arr|
     arr.shift.split(/[: ]/) + arr # first position only
     # ⇓ this will convert hours, minutes and seconds  to integers
     # arr.shift.split(/[: ]/).map { |e| e[/\A\d+\z/] ? e.to_i : e } + arr
     # ⇓ this would work for all strings
     # arr.flat_map { |e| e.is_a?(String) ? e.split(/[: ]/) : e }
   end
#⇒ [
#  [0] [
#    [0] "2013-08-22",
#    [1] "13",
#    [2] "23",
#    [3] "12",
#    [4] "+0212",
#    [5] 100,
#    [6] 1
#  ],
#  [1] [
#    [0] "2013-09-22",
#    [1] "14",
#    [2] "25",
#    [3] "12",
#    [4] "+0123",
#    [5] 123,
#    [6] 1
#  ]
# ]

【讨论】:

  • 非常干净的解决方案。是否可以以简单简洁的方式将小时、分钟和秒转换为整数(按照 OP 的要求)? (不像我的not-so-pretty solution
  • 只是想感谢大家,尤其是你们,因为这篇文章对我帮助最大!
【解决方案3】:

这是另一个选项(将小时、分钟和秒转换为整数):

arr = [["2013-08-22 13:23:12 +0212", 100, 1], ["2013-09-22 14:25:12 +0123" , 123, 1]]

arr.map do |item|
  date, time, zone = item[0].split.map { |e| e.split(":") }
  [date, time.map(&:to_i), zone, item[1..-1]].flatten
end
#=> [["2013-08-22", 13, 23, 12, "+0212", 100, 1], ["2013-09-22", 14, 25, 12, "+0123", 123, 1]]

【讨论】:

    【解决方案4】:

    无损方式。参考@mudasobwa answer

    arr = [["2013-08-22 13:23:12 +0212", 100, 1], ["2013-09-22 14:25:12 +0123" , 123, 1]]
    arr.map {|e| e[0].split(/[ :]/) + e[1..-1] } 
    #=> [["2013-08-22", "13", "23", "12", "+0212", 100, 1], ["2013-09-22", "14", "25", "12", "+0123", 123, 1]]
    

    【讨论】:

    • 也取自 mudasobwa 答案:arr.map {|e| e[0].split(/[ :]/).map { |e| e[/\A\d+\z/] ? e.to_i : e } + e[1..-1] } 将小时、分钟和秒转换为整数(按照 OP 的要求)。
    猜你喜欢
    • 2019-01-17
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多