Ruby で CSV ファイルを別表現の CSV に変換することが全体の目標ですね。
いくつかの段階に分割して考えてみます。
- CSV ファイルから文字列を読み出す
- 読み出した文字列を CSV として解釈し(パースなどと言います)、Ruby の内部表現に直す
- 内部表現について集計操作を行い、結果を生成するのに都合のよい内部表現に変換する
- 変換された内部表現を CSV の文字列にする(シリアライズなどと言います)
- CSV 文字列をファイルに書き出す
(ここで、内部表現というのは、変数に格納できるような、配列やハッシュのようなデータであると考えてください。)
このうち、2 については Ruby の標準ライブラリにうってつけのものがあります。また、このライブラリにある CSV#read
を使えば、1 の段階もやってくれます。こんな感じです。うまくパースしてくれています:
ruby
1# frozen_string_literal: true
2
3require 'csv'
4
5CSV.read('data.csv', headers: :first_row).map do |row|
6 pp row
7end
$ ruby main.rb
#<CSV::Row "日付":"2020-10-04" "学籍番号":"S001" "名前":"イチロー" "出欠":"出席">
#<CSV::Row "日付":"2020-10-04" "学籍番号":"S002" "名前":"ジロー" "出欠":"出席">
#<CSV::Row "日付":"2020-10-04" "学籍番号":"S003" "名前":"サブロー" "出欠":"欠席">
#<CSV::Row "日付":"2020-10-11" "学籍番号":"S001" "名前":"イチロー" "出欠":"出席">
#<CSV::Row "日付":"2020-10-11" "学籍番号":"S002" "名前":"ジロー" "出欠":"遅刻">
#<CSV::Row "日付":"2020-10-11" "学籍番号":"S003" "名前":"サブロー" "出欠":"出席">
残る 3 から 5 についての操作です。
3 の操作は otn さんが方針を示されています。ここがアルゴリズム力の見せどころです。
4 の操作はやはり CSV のライブラリに使い方が書かれています。CSV クラスの書き込みを参照してください。そしてどうやら、CSV#open
を使うと 5 もやってくれるようです。
以上のように、段階を細分化して考えると解決が簡単に見えてきませんか。
なにか不明な点がありましたらコメントをいただけますと幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/23 06:58