#!/usr/bin/ruby

# Comma Separated Value

require 'csv'

## 읽기

csv = <<CSV
Charlie, 13
Steve, 43
Jane, 27
CSV

data = CSV.parse(csv)
p data # [["Charlie", " 13"], ["Steve", " 43"], ["Jane", " 27"]]

data = CSV.parse_line(csv) # 맨 첫 줄만 읽습니다.
p csv.parse_csv # 문자열에도 메서드가 추가되었습니다만, 첫 줄만 읽습니다.

data = CSV.read('sample.csv') # 파일에서 바로 읽어 올 수도 있아요.

CSV.foreach('sample.csv') do |row|
  p row # 각 행마다 반복적으로 블록을 통해 처리할 수도 있어요.
end

## 헤더와 함께 읽기

csv_with_header = <<CSV
Name, Age
Charlie, 13
Steve, 43
Jane, 27
CSV
data = CSV.parse(csv_with_header, headers: true)
p data.headers
data.each do |row|
  p row.to_h
end


## 내보내기

string = CSV.generate() do |csv|
  csv << ['Name', 'Age']
  csv << ['Charlie', 13]
  csv << ['Steve', 43]
  csv << ['Jane', 27]
end
p string


## 인스턴스 메서드

csv = <<CSV
Name, Age
Charlie, 13
Steve, 43
Jane, 27
CSV

parser = CSV.new(csv, headers: true)
p parser
p parser.shift.to_h


## 옵션

DEFAULT_OPTIONS = {
  # For both parsing and generating.
  col_sep:            ",",
  row_sep:            :auto,
  quote_char:         '"',
  # For parsing.
  field_size_limit:   nil,
  converters:         nil,
  unconverted_fields: nil,
  headers:            false,
  return_headers:     false,
  header_converters:  nil,
  skip_blanks:        false,
  skip_lines:         nil,
  liberal_parsing:    false,
  nil_value:          nil,
  empty_value:        "",
  strip:              false,
  # For generating.
  write_headers:      nil,
  quote_empty:        true,
  force_quotes:       false,
  write_converters:   nil,
  write_nil_value:    nil,
  write_empty_value:  "",
}

END{
  # https://ruby-doc.org/3.3.0/stdlibs/csv/CSV.html
}
