我在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], [.....]]
有谁知道如何解决这个问题?
答案 0 :(得分:2)
如果您想要更多可读性,我建议:
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
它非常清楚结果数组的每个元素是什么。如果您拥有有意义的名称,则应将a
和b
替换为。
答案 1 :(得分:1)
[["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
# ]
# ]
答案 2 :(得分:0)
这是另一个选项(将小时,分钟和秒转换为整数):
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]]
答案 3 :(得分:0)
非破坏性的方式。 ref @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]]