CSVの基礎（特異メソッドとインスタンスメソッド）


CSVを学んだのでリファレンスを参照して整理しておきます

#CSVとは
　CSVファイルやデータに対する完全なインターフェースを提供するクラス。

　開発現場では大量のデータを扱うためにExcelでCSVデータを作成して、それをデータベースに一気に投入するという方法がよく利用されるらしい。

#読み込みの例
```ruby
require "csv"

csv_text = <<~CSV_TEXT
  Ruby,1995
  Rust,2010
CSV_TEXT

IO.write "sample.csv", csv_text

# ファイルから一行ずつ
CSV.foreach("sample.csv") do |row|
  p row
end
# => ["Ruby", "1995"]
#    ["Rust", "2010"]

# ファイルから一度に
p CSV.read("sample.csv")
# => [["Ruby", "1995"], ["Rust", "2010"]]

# 文字列から一行ずつ
CSV.parse(csv_text) do |row|
  p row
end
# => ["Ruby", "1995"]
#    ["Rust", "2010"]

# 文字列から一度に
p CSV.parse(csv_text)
# => [["Ruby", "1995"], ["Rust", "2010"]]
```
##特異メソッド（読み込み）
###require "csv"
外部ファイルの読み込みを行うメソッド
"CSV"(ライブラリ名)を渡して指定する

###IO.write(path, string)
path で指定されるファイルを開き、string を書き込み閉じる。

パラメータ|説明
-|-
path: |ファイル名文字列を指定
string: |書き込む文字列を指定

###CSV.foreach(path, options)
CSVファイルを読むための主要なインターフェース
各行が与えられたブロックに渡される

パラメータ|説明
-|-
path:　|CSVファイルパスの指定
options:　|CSV.new のオプションと同じオプションを指定できる

###CSV.read(path, options)
　CSVファイルを二次元配列にするために使う
　headersオプションに偽でない値を指定した場合はCSV::Table オブジェクトを返す

パラメータ|説明
-|-
path:　|CSVファイルパスの指定
options:　|CSV.new のオプションと同じオプションを指定できる


###CSV.parse(str, options )
文字列を簡単にパースすることができる。
ブロックを与えた場合は、ブロックにそれぞれの行を渡す。
ブロックを省略した場合は、二次元配列を返す。

パラメータ|説明
-|-
str:|文字列を指定
options:|CSV.new のオプションと同じオプションを指定できる

#書き込みの例
```ruby
require 'csv'

# ファイルへ書き込み
CSV.open("path/to/file.csv", "wb") do |csv|
  csv << ["row", "of", "CSV", "data"]
  csv << ["another", "row"]
  # ...
end

# 文字列へ書き込み
csv_string = CSV.generate do |csv|
  csv << ["row", "of", "CSV", "data"]
  csv << ["another", "row"]
  # ...
end
```
##特異メソッド（書き込み）
###CSV.open(filename, options )
　IOオブジェクトをオープンしてCSVでラップする。
　CSVファイルを書くための主要なインターフェース。

　ブロックが与えられた場合はブロックにCSVオブジェクトを渡し、ブロック終了時にクローズする。

　ブロックが与えられなかった場合はCSVオブジェクトを返す。

パラメータ|説明
-|-
filename:|ファイル名を指定
options:|CSV.new のオプションと同じオプションを指定できる

###CSV.generate(str = "", options )
　与えられた文字列をラップしてCSVのオブジェクトとしてブロックに渡す。
ブロック内でCSVオブジェクトに行を追加できるブロックを評価した結果は文字列を返す。

　このメソッドに与えられた文字列は変更されるので、新しい文字列オブジェクトが必要な場合は Object#dupで複製すること。

パラメータ|説明
-|-
str:|文字列を指定。デフォルトは空文字列。
options:|CSV.new のオプションと同じオプションを指定できる。

###CSV.new(data, options)
　CSV ファイルを読み込んだり、書き出したりするために String か IO のインスタンスをラップする。

　ラップされた文字列の先頭から読み込む。文字列に追記したい場合は CSV.generate を使用。他の位置から処理したい場合はあらかじめそのように設定した StringIO を渡す。

パラメータ|説明
-|-
data:|String か IO のインスタンスを指定。 String のインスタンスを指定した場合、CSV#string を使用して後からデータを取り出す。
options:|CSV をパースするためのオプションをハッシュで指定。インスタンスメソッドではオプションを上書きすることが出来ない。上書きしたい場合は必ずここで上書きする。

オプション|説明
-|-
:col_sep|フィールドの区切り文字列を指定。
:row_sep| 行区切りの文字列を指定。:auto という特別な値をセットすることができる。
:quote_char|フィールドをクオートする文字を指定。長さ 1 の文字列でなければいけない。
:field_size_limit|制限を使用してDos攻撃を防ぐ。
:converters|CSV::Converters から取り出した名前の配列。変換器が一つだけの場合は配列に格納する必要はない。
:unconverted_fields|真をセットすると CSV::Row#unconverted_fields という変換前のフィールドを返すメソッドを全ての行に追加する。
:headers|:first_row というシンボルか真を指定すると、CSV ファイルの一行目をヘッダとして扱う。配列を指定するとそれをヘッダとして扱う。文字列を指定すると CSV.parse_line を使用してパースした結果をヘッダとして扱う。
:return_headers|偽を指定すると、ヘッダ行を無視。真を指定すると、ヘッダ行をヘッダと値が同一の CSV::Row のインスタンスとして返す。
:write_headers|真を指定して :headers にも値をセットすると、ヘッダを出力する。
:header_converters|ヘッダ専用の変換器を定義。
:skip_blanks|真を指定すると空行を読み飛ばす。
:force_quotes|真を指定すると全てのフィールドを作成時にクオートする。
:skip_lines|指定した正規表現にマッチしたそれぞれの行をコメントとして読み飛ばす。



##クラスインスタンス
###headers
nil を返した場合は、ヘッダは使用使用されない。
真を返した場合は、ヘッダを使用するがまだ読み込まれない。
配列を返した場合は、ヘッダは既に読み込まれている。

###self << row
自身に row を追加。
データソースは書き込み用にオープンされていなければならない。

パラメータ|説明
-|-
row:|配列か CSV::Row のインスタンスを指定。 CSV::Row のインスタンスが指定された場合は、CSV::Row#fields の値のみが追加される。

参考もと
[RRuby 3.0.0 リファレンスマニュアル>ライブラリ一覧>csvライブラリ  >CSVクラス](https://docs.ruby-lang.org/ja/latest/class/CSV.html)