質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

2回答

2315閲覧

RubyでCSVファイルの集計したい

biscuit_oliva

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/07/22 11:52

前提・実現したいこと

初心者です。このようなCSVファイルが既に用意されている状況です。
このデータを用いてもう一つ下のような結果のCSVファイルを出力したいと考えています。
どのような文を書けばいいのか教えていただけないでしょうか
|日付|学籍番号|名前|出欠|
|:--|:--:|--:|
|2020-10-04|S001|イチロー|出席|
|2020-10-04|S002|ジロー|出席|
|2020-10-04|S003|サブロー|欠席|
|2020-10-11|S001|イチロー|出席|
|2020-10-11|S002|ジロー|遅刻|
|2020-10-11|S003|サブロー|出席|

|学籍番号|名前|出席|欠席|遅刻
|:--|:--:|--:|
|S001|イチロー|13|1|1
|S002|ジロー|14|1|0
|S003|サブロー|10|2|3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Ruby で CSV ファイルを別表現の CSV に変換することが全体の目標ですね。
いくつかの段階に分割して考えてみます。

  1. CSV ファイルから文字列を読み出す
  2. 読み出した文字列を CSV として解釈し(パースなどと言います)、Ruby の内部表現に直す
  3. 内部表現について集計操作を行い、結果を生成するのに都合のよい内部表現に変換する
  4. 変換された内部表現を CSV の文字列にする(シリアライズなどと言います)
  5. 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 00:05

gemmaro

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

biscuit_oliva

2020/07/23 06:58

回答ありがとうございました。おかげさまで期待しているような結果を得ることができました。
guest

0

ベストアンサー

出席カウンターと欠席カウンターを、学籍番号をキーとしたハッシュで用意し(初期値ゼロ)、
学籍番号を使ってそのカウンターを+1していく。
名前も学籍番号をキーとしたハッシュに保存する。

ファイルを読み終わったら、どれでもいいのでハッシュのキーのリストをソートして、その順番でレコードを作って出力する。

というくらいが思いつかないとすると、ハッシュについて理解が不足している可能性があるので、まずは復習からでしょうか。

投稿2020/07/22 12:57

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

biscuit_oliva

2020/07/23 06:55

回答ありがとうございました。まだまだ理解は浅いですがとりあえずは実現することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問