環境はWindows10Pro64bit、ruby2.4です。
本記事は以前Rubyをまとめたこちらの記事をもっと簡易化したものです。
https://okenigou.com/?p=811
INDEX
- 必須メソッド60個
- ベンチメソッド
- Rubyコツ
- Ruby基礎
- Rubyキーワード
- 正規表現
- 例外処理
- to_メソッド
- 組み込み、標準、gemライブラリの利用
- ライブラリ「pp」
- OS内のフォルダ・ファイル操作
- WEB情報取得系
- WEBアプリケーションを作成する
- イディオム追加「Array.map(&:method)」
- 改行コードを統一するイディオム
- 日時の取り扱い
- タイマーメソッド
- Rangeオブジェクト
- 数字以外のRangeオブジェクト
- Fileの取り扱い
- CSVの取り扱い
必須メソッド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 = “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_arraynew_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つを紹介する。
積集合[]&[] 和集合[]|[] 差集合[]-[] [] + [] |
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.each do |ele| hash = {one: 1, two: 2} hash.each do |key, value| hash.each do |ele| |
each_with_index | パラメータに「i」を追加することでインデックス番号を取得できる。 iはよく数字の変数で使われます。 |
array = [“apple”, “melon”, “banana”, “greap”, “orenge”]
array.each_with_index do |ele, i| |
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 おはよう こんにちは こんばんは EOSstr.each_line.with_index do |line, index| p “行#{index + 1}:#{line}” endstr.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 arrayhash = {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
- エンコード知識
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