2017-07-20 15 views
0

このように私は、Rubyで多次元配列を持っている: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], [.....]]

は、誰もがこの問題を解決する方法を知っていますか?ここで

+1

私の質問は、どのようにあなたの出発点に到着することができましたか?たぶん、多次元配列のdatetimeの文字列表現を避けることができ、はるかにエレガントに実装できます。 –

+0

これらはファックスマシンによって生成されたデータで、json形式で保存されます。合計で私はそれに上記の配列の52000の配列を持って...私はそれらを処理することができます、私はそれらを要求された形式に変換する必要があります。 – Fran

+0

JSON - >多次元配列 - >配列 - >処理された配列があります。 APIからJSONを取得していると仮定すると、中間ステップのいくつかをスキップするFaxクライアントを作成できると思います。 –

答えて

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]] 
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 
# ] 
# ] 
+0

非常にきれいな溶液です。シンプルで簡潔な方法で、時間、分、秒を整数に変換することは可能ですか(OPによって要求されるように)? (私の[not-so-pretty solution](https://stackoverflow.com/a/45214780/6136634)とは異なります) – Gerry

+0

@Gerryなぜですか?私は答えを更新しました。 – mudasobwa

+0

このポストが私を最も助けてくれたので、皆さん、そして特にあなたに感謝したいと思います! – Fran

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 

それは非常にそれを作ります結果の配列の各要素が何であるかを明確にします。あなたが持っている場合は、abを意味のある名前に置き換えてください。

+1

あなたは '+0212 ''文字列を失っていますが、これはとてもいいですね。ところで、 'd'を' date_time'で変更する必要があります。 :) – Gerry

+1

これをアップする。 Rubyはdatetimeを解析する標準的な方法を持っているので、再利用する必要はありません。 –

+0

ありがとう!あなたは 'date_time.to_date.to_s'と' date_Time.zone.to_s.gsub( ':'、 '') 'だけでなく、もっと良い方法を知っていますか?それらは私が本当に好きではなかった2つの部分でした。戻り値を作成する前に、それらを別々の変数に取り出すことが最善の方法かもしれません。 – ardavis

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]] 
+0

またmudasobwaから取った答え: 'arr.map {| e | e [0] .split(/ [:] /)。map {| e | e [/ \ A \ d + \ z /]? e.to_i:e} + e [1 ..- 1]} '(OPが要求した通りに)時間、分、秒を整数に変換する。 – Gerry