Rubyまとめver2

環境はWindows10Pro64bit、ruby2.4です。

本記事は以前Rubyをまとめたこちらの記事をもっと簡易化したものです。
https://okenigou.com/?p=811

INDEX

必須メソッド60個

メソッド 作用 見本
文字列専門メソッド13個「サニサニエンコカタカナ、置換配列文字大小」
strip 文字列両端の空白メタ文字を削除する。
lstrip、rstripもあります。
p “\nhello “.strip
chomp 末尾の改行文字をカット p “hello\nmorning\n”.chomp
encode 文字コードを変換。replaceを必ず覚えること。 puts “hello”.encode(“cp932”)
puts “hello”.encode(“UTF-8”, :undef => :replace, :invalid => :replace, :replace => “hoge”)
unicode_
normalize(:nfkc)
英数字は半角へ、カタカナは全角へ変換する。 puts “MILKチョコは120円です”.unicode_normalize(:nfkc)
gsub 「正規表現または文字列」で部分特定させて、任意の文字に置換する。 puts “hello”.gsub(“he”, “abc”)
puts “hello”.gsub(/he/, “abc”)
sub gsubと同じだが、置換されるのはマッチした最初のものだけ。 puts “hello”.sub(“l”, “x”)
chars 1文字ごとに分解し、配列にする。 p “str”.chars
lines 複数行の文字列を、改行文字で区切り、配列にする p “abc\nlm\nxyz\n”.lines
split 半角空白メタ文字で区切り、配列を返す。
分割文字は指定可能。
p “今日は,とて\tも いい天気 ですね”.split
p “今日は,とて\tも いい天気 ですね”.split(“,”)
p “今日は,とて\tも いい天気 ですね”.split(/\s| /)
p “今日は,とて\tも いい天気 ですね”.split(//)
upcase すべて大文字にする。 puts “hello”.upcase
downcase すべて小文字にする。 puts “HELLo”.downcase
capitalize 先頭を大文字にする。 puts “hello”.capitalize
swapcase 文字の大小を入れ替える。 puts “HeLLo”.swapcase
文字列専門以外のメソッド47個「わりと共通メソッド14個」「2ペア4つ, 3サイレンカウ, 1, 1, 1」
empty?
nil?
「カラですか?→Yes、No」
「存在してますか?→Yes、No」
似たようなメソッドでblank?とpresent?もあります。
str = nil
p str.nil?
p “hello”.empty?
respond_to?
methods
指定したメソッド名が使えるかどうか判定する。
methodsはメソッド一覧を表示する。
p String.respond_to?(“class”)
p “hello”.methods
key?()
value?()
ハッシュに対して指定したキー・バリューを持つかどうか判定する。 hash = {one: 1, two: 2}
p hash.key?(:one)
p hash.value?(“coffee”)
even?
odd?
偶数か奇数か判定する。 p 2.even?
p 2.odd?
size
length
count
文字数や配列数を返します。 p “hello”.size
p [1, 2, 3, 4, 5].size
p [1, 2, 3, 4, 5].count
class 所属クラス名を返します。デバッグによく使います。 p “hello”.class
p Object.class
encoding 文字コードの種類を返します。 p “hello”.encoding
match 引数に正規表現か文字列をとり、MathDateオブジェクトを取得する。
よくif文の条件判定で使う。
p “hello”.match(/l/)
p “hello”.match(“l”)
文字列専門以外のメソッド47個「「残りメソッド33個」「ユニークな晩飯をmmsumガンダムにjoinして、『ジップとマージを4つの宝』の地図で位置を確認して、『配列CRUD』を使って探索する。」
uniq 配列の中の重複データを削除し、1つだけにする。 p [1, 2, 3, 3, 4, 5, 5].uniq
str[] = “” 文字列を配列として見立て、抽出、削除、置換などいろいろできる。
そして意外とArrayやHashにも使用できたりする。

1.インデックス1文字ピンポイント指定
2.範囲指定
3.開始位置から何番目指定
4.正規表現
5.文字列指定

str = “BITTER_CARAMEL_LATTE”
p str
p str[2]
p str[1..3]
p str[1, 2]
p str[1, 1] #これは自分自身だけを示す
p str[/MEL/]
p str[“LAT”]

x = str[5]
p x
#文字を指定して別の変数に保存する

上記メソッドの補足
([] = “”)
「3.開始位置から何番目」については「0と1とそれ以外」を覚えること。

【第2引数の意味】
str[2, X]
0→自分の前
1→自分自身のみ
2→以降自分を含めて後ろ

str = “BITTER_CARAMEL_LATTE”
p str[2, 0] #自分自身の前を示す
p str[2, 1] #自分自身を示す
p str[2, 2] #自分を含めて2つを示す
min 配列の中の最小値を返す。 p [“a”,”b”,”c”].min
p [1, 2, 3].min
max 配列の中の最大値を返す。 p [“a”,”b”,”c”].max
p [1, 2, 3].max
minmax 配列の中の最小値、最大値を同時に返す。 p [“a”,”b”,”c”].minmax
p [1, 2, 3].minmax
sum 個人的に配列データが数字に限り使用します。 array = [1, 2, 3, 4, 5, 6]
p array.sum
shuffle 配列の並び順をシャッフルする。 array = [“apple”, “melon”, “banana”, “greap”, “orenge”]
p array.shuffle
sample 配列からデータをランダムに表示する。 array = [“apple”, “melon”, “banana”, “greap”, “orenge”]
p array.sample
p array.sample(1)
p array.sample(2)
join 値だけをつなげて文字列化する。inspectは記号含めて文字列化します。 array = [“apple”, “banana”, “melon”, “greap”, “orenge”]
p array.join
p array.join(“”)
p array.join(“;”)
zip 個人的に2つの配列の比較、または同時回しで使用します。
zipで返ってきた配列をeachで回すことで同時(比較)処理が可能です。
array_1 = [1, 2, 3, 4]
array_2 = [9, 8, 7, 6, 7]

zip_array = array_1.zip(array_2)
p zip_array

new_zip_array = zip_array.select do |ele|
  ele[1] % ele[0] == 0
end
p new_zip_array

merge 2つのハッシュを合体する。
キーに重複が発生した場合は追加ハッシュの値を優先します。
hash_1 = { name: “taro”, age: 24, hobby: “soccer” }
hash_2 = { tel: “00000000”, hobby: “golf” }
p hash_1.merge(hash_2)
[] &, |, -, + [] 3つの集合と配列の足し算1つを紹介する。

積集合[]&[]
積集合は「どっちにもあるもの」を集めた配列を返す。

和集合[]|[]
和集合は「どっちかにひとつだけでもあるもの」を集めた配列を返す。

差集合[]-[]
差集合は「引いたもの」の配列を返す。

[] + []
「+」と「.concatメソッド」はどちらも結果は同じです。
シンプルにつなげることができます。

p [1, 1, 2, 3, 4] & [1, 5]
p [1, 1, 2, 3, 4] | [1, 5]
p [1, 1, 2, 3, 4] – [1, 5]

array1 = [1,2,3,4]
array2 = [4,5,6,7]
p array1 + array2
p array1.concat(array2)

map do~endブロック内の処理後の新配列を返します。 array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
p array.map { |x| x + 1 }
each 要素1つずつに同じ処理を施します。
ブロックパラメーターに値を複数持たせると便利です。
Hashの場合はデータペアごとに処理を回します。
ブロックパラメーターは|key, value|で取っておけば基本的に問題ありません。

リストから順に値を取り出し、その値を利用した処理を行う。

#シンプルeach
array = [ “a”,”b”,”c” ]
array.each do |ele|
  p ele * 2
end

#複数ブロックパラメーター
nest = [
  [1, “a”],
  [2, “b”],
  [3, “c”],
]

nest.each do |num, str|
  puts “数字が#{num}”
  puts “文字が#{str}”
end

#複数インデックスアクセス
array = [
  [1, “a”],
  [2, “b”],
  [3, “c”],
]

array.each do |ele|
  puts ele[0].to_s + ” and ” + ele[1]
end

hash = {one: 1, two: 2}

hash.each do |key, value|
  puts “キーは#{key}で、バリューは#{value}です。”
end

hash.each do |ele|
  p ele # => [key, value]
end

each_with_index パラメータに「i」を追加することでインデックス番号を取得できる。
iはよく数字の変数で使われます。
array = [“apple”, “melon”, “banana”, “greap”, “orenge”]

array.each_with_index do |ele, i|
  p “#{ele}と#{i}”
end

each_line each_lineは複数行の文字列を配列化せずに処理を回す。
改行文字を区切り点として行判断します。
複数行の文章などを直接一行ごとに何かしらの処理をしたい時に使えます。
“おはよう\nこんにちは\nこんばんは\n”.each_line do |line|
  p line * 3
end
each_char each_charは文字列を配列化せずに1文字ずつ処理を回します。
配列化せずに1文字ごとに何かしらの処理をしたい時に使えます。
しかし、未だその状況に遭ったことはない。
“こんにちは”.each_char do |char|
  p char * 3
end
each_slice 普通のeachは要素をひとつずつ取り出します。
sliceは値を何個ずつ取り出すか決めることができます。
例えば「3個ずつ処理したい」ときに使うことができます。
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.each_slice(2) do |ele|
  p ele
end
.with_index チェーンメソッドとして利用します。
インデックス番号が必要な場合にこれを使う。
引数を指定して、任意の番号から始めることができます。
str = <<EOS
おはよう
こんにちは
こんばんは
EOS

str.each_line.with_index do |line, index|
p “行#{index + 1}:#{line}”
end

str.each_line.with_index(1) do |line, index|
p “行#{index}:#{line}”
end

push, << 配列の最後尾に”値”を追加する。
Array.push(“値”, “値”, “値”)とすれば複数のデータを最後尾に追加できる。
array = [1, 2, 3]
p array.push(“hello”)
p array.push(“a”, “b”)
p array << “x” << “y”
#または、
p array << [“e”, “f”, “g”]
pop 配列の最後尾のデータを削除する。
引数に数字を指定すると末尾から指定した数だけ削除する

array = [1, 2, 3, 4]
p array.pop
p array
array.pop(2)
p array
unshift 先頭0番目にデータを追加する。要は先頭に値を割り込ませる。
コンマ区切りで複数データを追加できます。
array = [1, 2, 3]
p array.unshift(“値”)
shift 先頭データを削除する。
引数に数字を指定すると先頭から指定した数だけ削除する。
array = [1, 2, 3, 4]
p array.shift
p array
array = [1, 2, 3, 4]
p array.shift(2)
p array
insert insert(2, “挿入文字列”)で「2番文字の前に指定文字列を挿入する」メソッド。
万能メソッドを使いarray[2, 0] = “inject”でも同じ効果になる。
array.insert(0, “inject”)とすればunshiftと同じ効果になる。
array.insert(arr.length, “inject”)とすればpushと同じ効果になる。

ArrayだけではなくStringにも使える。動き、使い方はArrayと変わらない。

#Array
array = [1, 2, 3, 4]
p array.insert(1, “insert”)

#String
p “hello”.insert(1, “zzz”)

slice 引数に指定した文字列または正規表現に当てはまったものを削除できる。
また戻り値を別の変数に保存すれば抽出として使用できる。
部分削除したいならslice!で破壊する。
引数の指定方法は5つ。これは万能メソッドのところと共通します。
str = “BITTER_CARAMEL_LATTE”
str.slice(2) #インデックス指定
str.slice(3..5) #範囲指定
str.slice(0, 3) #開始位置指定
str.slice(/CAR/) #正規表現指定
str.slice(“CAR”) #文字列指定
delete Array.delete(“データを指定”)として、引数には既知のデータを指定する。
よって何が入っているか知っていないと使えない。
配列に同じデータがあったら、すべて消える。
array = [“a”, “b”, “c”, “d”, “f”, “g”, “e”, “a”]
p array.delete(“a”)
p array
delete_at Array.delete_at(2)は引数で指定したインデックス番号のデータを削除する。 array = [“a”, “b”, “c”, “d”, “f”, “g”, “e”, “a”]
p array.delete_at(3)
p array
scan S.scanは配列を返します。
S.scan(/正規表現/)または(“文字列”)で文字列内を検索します。
指定した正規表現または文字列の配列を返します。
要するに複数マッチした場合は同じ文字列が並んだ配列を返します。
p “さんまのまんま”.scan(/ま/)
p “ヒット数は#{“さんまのまんま”.scan(/ま/).count}です。”
grep Array.grep(/文字列/)として配列を返す。
引数に正規表現を指定し、要素ごとにパターンマッチするか判定する。
動きがeachとselectに似ている。
ブロックは不要。grepによるパターンマッチは「===」で行われる。
array = [“only”, “clearlly”, “fast”]
p array.grep(/ly/)
select 配列から条件式に合ったものだけを集めた配列を返します。
保存しなければすぐに消えます。
select!として破壊的にすると元配列を新配列(破壊)に変えることができます。
do~endの中には条件文を記述する。
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.select! do |x|
x.even?
end
puts array

hash = {name: “taro”, age: 24, hobby: “soccer”}

sel_hash = hash.select do |key, value|
key.match(“e”)
end

puts sel_hash

ベンチメソッド

使い方を工夫すれば、可能性のあるメソッドたち。

メソッド 作用 見本
sort Array.sortはデータ順を昇順にする。
降順にする場合sortしてからreverseさせる。
array = [“apple”, “melon”, “banana”, “greap”, “orenge”]
p array.sort
p array.sort.reverse
reverse 配列の順番を逆順にする。
ソフト「clibor」を利用した際に使える。
array = [1,2,3,4]
p array.reverse
center 文字列の幅を指定しておき中央寄せを行う。
第二引数に指定がなければ空白部分をスペースで埋める。
文字数のほうが多ければ何も起こらない。
p “hello”.center(12)
p “hello”.center(3)
p “hello”.center(12, “☆”)
rjust 使用方法はcenterと同様で、右寄せが出来る。 str = “hello”
p str.rjust(12)
ljust 使用方法はcenterと同様で、左寄せが出来る。 str = “hello”
p str.ljust(12)
squeeze 「連続して重複する文字」を1つにする。
「連続して重複するスペース」を1つにする。
「連続して重複する改行文字」を1つにする。
削除という言い方もできる。
引数にまとめる文字を指定することができる。
スクレイピングしたとき、文字が離れ離れになっているときがある。
見た目の簡素化するのに使える。
p ”    he\n\n    ll\t\tl        o”
p ”    he\n\n    ll\t\tl        o”.squeeze
p “hello”.squeeze(” “)
+,<< 「+」はシンプルに連結し、「<<」は元データを破壊して連結する。 String1 + String2 + String3
String1 << String2 << String3
chop 改行文字とか関係なく、とにかく最後の1文字を消す。 p “hello”
p “hello”.chop
=~ 「String =~ (/正規表現/)」は文字列と正規表現を比較する。
trueならマッチ開始位置を表示、falseならnilを返す。
str = “BITTER_CARAMEL_LATTE”
p str =~ (/TT/)
p str =~ (/Z/)
index 検索文字を文字列か正規表現で指定し、最初の該当の開始位置を返す。
第二引数に検索開始場所(インデックス番号)を指定できる。
str = “wjedfsdhelloehnrnhello”
p str.index(“hello”)
p str.index(“hello”, 10)
p str.index(“hello”, 20)
match? 指定した正規表現の有無を確認し、trueかfalseで返す。 str = “helloZZZ”
p str.match?(/ZZZ/)
inspect 配列を記号も含めて文字列にする。
to_sと同じ。
検索対象文字の有無を確認できる。
探索メソッドを使いやすくする。
array = [1, 2, 3, 4]
p array.inspect
flatten ネストすべて取っ払う。
入れ子の階層を全てフラットにする。
取っ払い段階を数字で指定することができる。
検索対象文字の有無を確認できる。
構造はバラバラになるが、探索メソッドを使いやすくする。
nest = [[1, [“x”, “y”]], [2, [“n”, “m”]]]
p nest.flatten
nest = [[1, [“x”, “y”]], [2, [“n”, “m”]]]
p nest
p nest.flatten(0)
p nest.flatten
p nest.flatten(1)
p nest.flatten(2)
p nest.flatten(3)
first Array.firstは配列の先頭データを返す。 array = [“apple”, “melon”, “banana”, “greap”, “orenge”]
p array.first
#”apple”
last Array.lastは配列の最後のデータを返す。 array = [“apple”, “melon”, “banana”, “greap”, “orenge”]
p array.last
#”orenge”
reject 条件式に合わないものを集めて配列を返します。
selectの反対。
ifとunlessのような関係です。
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
reject = array.reject do lllxlll
  x.even?
end
p reject
#[1, 3, 5, 7, 9]というように奇数だけ揃う
find 配列から条件を満たす「最初の」要素を返す。 array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
find = array.find do lllxlll
  x.even?
end
p find
partition selectとrejectの処理を両方行い、ネスト配列を返す。
2次元配列を返す。
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a = array.partition do lllxlll
  x.even?
end
p a
all? 配列のすべてのデータが条件式に合った場合trueを返す。 result = [1, 2, 3 , 4].all? do lllilll
  i >= 2 #条件式を書く
end
p result
any? 配列のデータのうち1つでもtrueがあればtrueを返す。 result = [1, 2, 3 ,4].any? do lllilll
  i >= 4 #条件式を書く
end
p result
keys Hash.keysはキーだけの配列を作成し、返す。 hash = {name: “taro”, age: 24, hobby: “soccer”}
p hash.keys
values Hash.valuesはバリューだけの配列を作成し、返す。 hash = {name: “taro”, age: 24, hobby: “soccer”}
p hash.values

Rubyコツ

  • ひとつずつ覚えていきましょう。
  • わからなかったら調べましょう。
  • ちょっとだけ暗記の努力をしましょう。
  • そして自分だけの鉄板を持ちましょう。
  • ゆっくりひとつずつ覚えていきましょう。
  • ある程度ソラで書けるようになれれば、楽しくなると思います。
  • ある程度ソラで書けるようになれれば、成果も出てくると思います。

Ruby基礎

リテラル

リテラルとは「”abc”, 123, 0.1, /abc/, [“a”], {a: “b”}, 1..10, :a」などのこと。
「生データ」と言っていいかな。

演算子

「カッコ()」をうまく使えるようになれれば、上手に制御できるようになります。

「!, **, *, /, %, +, -, >, <, <=, >=, ==, !=, =~, or, and, ||, &&」など。

変数とスコープ

  • ifとwhileの制御構造はスコープ無し
  • ネストやeachのブロック文のスコープに注意
  • 「$グローバル変数」はスクリプト内のどこででも使用できる

条件分岐

if 条件式  
  ~  
elsif 条件式  
  ~  
else  
  ~  
end

反復・ループ

array.each do |ele|
  p ele
end

eachはあくまでもメソッドであり、制御構造とは言わないが「繰り返し」という意味では一番よく使うので記載しました。

制御

  • next
  • break
  • redo
  • catch~throw

同一と同値

  • 判定は「==」
  • オブジェクトIDの確認は「.object_id」
  • 同一性の比較メソッド「.equal?」

Rubyキーワード

  • 演算子
  • 配列
  • 破壊
  • ライブラリ
  • 制御構造・制御文(if, While, each, for, caseなど)
  • CRUDの概念
  • 文字列表現「”~”, ‘~’」
  • エスケープ
  • 特殊文字
  • ヒアドキュメント
  • 式展開#{}
  • 基本「レシーバ.メソッド(パラメーター, パラメーター) => リターン」
  • ハッシュと配列のメソッド名の互換性は高いです。
  • シンボル
  • 例外処理

正規表現

基本を抑えましょう。このテーマひとつでかなりの記事が書けそうです。

例外処理

簡単な例外処理をソラで書けるようになりましょう。意外とよく使います。「エラーは必ず起こる」が前提です。

begin
  #チャレンジしたいコード
  #やりたいこと
rescue
  #エラーが出たときの記述
  #処理を「止めない」ための記述
  #とりあえず最後まで「意図的に」処理させることを意識する
end

to_メソッド

メソッド 変換
to_s 文字列
to_f 小数
to_i 整数
to_a 配列
to_h ハッシュ
to_sym シンボル

組み込み、標準、gemライブラリの利用

  • ライブラリ「require “”」
  • RubyGems「gem install」

ライブラリ「pp」

ネストされていないと発動しません。スクレイピングの時に重宝しました。

OS内のフォルダ・ファイル操作

  • Dir
  • Pathname
  • Fileutils

WEB情報取得系

  • open-uri
  • Nokogiri
  • Mechanize
  • Selenium
  • kconv
  • mail
  • エンコード知識

WEBアプリケーションを作成する

  • Rails(むしろこれがメイン)

イディオム追加「Array.map(&:method)」

シンプルな処理の時にだけ使うこと。それ以外はきっと混乱します。このような「効率化」できる記述方法は積極的に覚えること。ソラで書けるようになれば楽しくなります。

#「マップアンドコロンメソッド」

array = ["a", "b", "c", "d"]
array.map!(&:upcase)
p array

puts ("abc" .. "hfr").to_a.map(&:upcase)

改行コードを統一するイディオム

これはスクレイピングした文字列にはサニタイズとして必須にしたほうがい。
改行コードを「\n」に統一する。

str = "newline\r\n"
p str.encode(str.encoding, universal_newline: true)

日時の取り扱い

ここら辺は正直混乱しています。「自分がどういう文字列が欲しいか?」を明確にしておけば、検索しやすいと思います。

require "date"
require "time"

date = Date.new
puts date.to_s

date = Date.today
puts date.to_s

puts DateTime.now

now = Time.now
puts now.strftime("%m・%d")
#require "time"がなくても上記の出力が可能でした。"time"って何に使うのか?

str = "20200330"
puts Time.parse(str)
puts Time.parse(str).strftime("%Y年%m月%d日")
#parseメソッドを使う時にtimeライブラリが必要ということがわかりました

タイマーメソッド

基本的に気休め程度の待機メソッド。シンプルに使用できます。

#3秒待機
sleep(3)

Rangeオブジェクト

(1..10).to_a
("abc" .. "hfr").to_a

数字以外のRangeオブジェクト

#例
now = Time.now
p (now..now+1)

Fileの取り扱い

File.openは空で書けるようになること。

  • r:読込
  • w:作成
  • a:追記

作成(追加)・読込

#文字列の場合
str = "おはよう\nこんにちは\nこんばんわ"

#ファイル作成
File.open("str.txt", "w") do |f|
  f.puts(str)
end

#ファイル読込
file = File.read("str.txt")
puts file
p file

puts "----------------------------------------"

#ファイル読込
file = File.readlines("str.txt")
puts file
p file
#配列の場合
array = ["おはよう", "こんにちは", "こんばんわ"]

#ファイル作成
File.open("array.txt", "w") do |f|
  array.each do |ele|
    f.puts(ele)
  end
end

#ファイル読込
file = File.read("array.txt")
puts file
p file

puts "----------------------------------------"

#ファイル読込
file = File.readlines("array.txt")
puts file
p file

CSVの取り扱い

CSV.openは空で書けるようになること。返り値は2次元配列か、「headers: true」オプションを使った場合は「CSV::Table」で返ってくる。

  • r:読込
  • w:作成
  • a:追記

【配列データがある場合】

csvファイルを作成して、改めて読み込む。

require "csv"

#配列データ
array = [
  ["商品","価格"],
  ["コーラ",100],
  ["オレンジ",120],
  ["ジンジャーエール",130],
]

#ファイル作成
CSV.open("test.csv", "w") do |f|
  array.each do |row|
    f.puts(row)
   #f << row
  end
end

#ファイル読込
csv_header = CSV.read("test.csv", headers: true)
csv = CSV.read("test.csv")

puts csv_header
puts "--------------------"
puts csv
puts "--------------------"
p csv_header
puts "--------------------"
p csv

【csvデータがある場合】

test.csv

商品,価格
コーラ,100
オレンジ,120
ジンジャーエール,130
require "csv"

#ファイル読込
#基本はこれでいけるが文字コードエラーが出た場合に注意が必要

csv = CSV.read("test.csv")

puts csv
puts "--------------------"
p csv

=begin
エラー
C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:2046:in `=~': invalid byte sequence in UTF-8 (ArgumentError)

文字コード変換
csv = CSV.read("test.csv", encoding: "shift_jis:utf-8")
=end
require "csv"

#ファイル読込
#基本はこれでいけるが文字コードエラーが出た場合に注意が必要

csv_h = CSV.read("test.csv", headers: true)

puts csv_h
puts "--------------------"
p csv_h

=begin
エラー
C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:2046:in `=~': invalid byte sequence in UTF-8 (ArgumentError)

文字コード変換
csv = CSV.read("test.csv", encoding: "shift_jis:utf-8")
=end

追記

CSV.open("test.csv", "a") do |csvfile|
  csvfile << ["青森産アップルジュース", 200]
 #csvfile.puts ["青森産アップルジュース", 200]
end

ヘッダーの取り扱い

読み込み時に「headers: true」を付けると読込ファイルは2次元配列ではなく、CSVオブジェクトになる。

#アクセス方法は、キーとインデックスで値を取得

require "csv"

csvfile = CSV.read("test.csv", headers: true)

csvfile.each do |row| #1行ごとに処理する
  puts row["商品"]
 #puts row[1]
end
タイトルとURLをコピーしました