Re: [問題] 為csv輸出特定格式

看板Ruby作者 (godfat 真常)時間16年前 (2008/10/23 00:35), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《itucson (愛吐桑)》之銘言: : 我有一筆csv檔案如下 : 1,0,1,0,1,0,0,0 : -1,0,1,0,0,1,0,0 : 1,0,1,1,0,0,0,0 : 想要輸出的格式是這樣 : label index1:value1 index2:value2 ... : 所以要出輸這樣子 : 1 1:0 2:1 3:0 4:1 5:0 6:0 7:0 : -1 1:0 2:1 3:0 4:0 5:1 6:0 7:0 : 已經想了一個晚上了,無奈資質駑鈍,實在沒輒 >< here's one-liner... for ruby 1.8.7 and later s = <<-CSV 1,0,1,0,1,0,0,0 -1,0,1,0,0,1,0,0 1,0,1,1,0,0,0,0 CSV require 'csv' puts CSV.parse(s).map{ |x| [ x[0], *x[1..-1].each.with_index.map{ |y, i| "#{i+1}:#{y}"} ]. join(' ') }.join("\n") # => 1 1:0 2:1 3:0 4:1 5:0 6:0 7:0 -1 1:0 2:1 3:0 4:0 5:1 6:0 7:0 1 1:0 2:1 3:1 4:0 5:0 6:0 7:0 解說... 想辦法把 [1,0,1,0,1,0,0,0] 變成 [1, '1:0', '2:1', '3:0', ...] 所以 [ x[0], ... ] 第一個放第一個元素,後面用 splat 展開 他是去掉第一個元素的 mapping, 所以用 x[1..-1] 砍掉頭 先用 .each 把 array 變成 Enumerator, 接著就能夠用 .with_index 取得 index. 再 map, y 就會是原本的元素,而 i 就會是 index. 你要的 index 從 1 開始算,所以 map 成 "#{i+1}:#{y}" 到這裡就成功變出 [1, '1:0', '2:1', '3:0', ...] 接著用空白 join 起來,最後全部用 newline join 起來,就是結果了 -- 「行け!Loki!」(rocky ロッキー) -Gurumin ぐるみん 王子? XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18

10/23 22:13, , 1F
ruby的用法真是博大精深啊 Orz
10/23 22:13, 1F

10/23 22:13, , 2F
感謝版大總是熱心幫忙+解說 ^^
10/23 22:13, 2F
文章代碼(AID): #18_rOz_1 (Ruby)
討論串 (同標題文章)
文章代碼(AID): #18_rOz_1 (Ruby)