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

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

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

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

2回答

3246閲覧

【Ruby】文字数をカウントしてIF文で振り分けたい

kaori_oka

総合スコア176

Ruby

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

1グッド

1クリップ

投稿2020/01/18 15:05

編集2020/01/19 03:57

前提・実現したいこと

人の苗字が3文字だった場合のみに条件分岐をさせたいと思っています。
lengthメソッドで判定させようとしているのですが、
分岐がうまくいかず、
putsでログを見てみると、判定が全て「1」文字となっていました。

CSVから苗字データを引っ張っているのですが、
そこがうまくいかない原因でしょうか??

該当のソースコード

ruby

1require "csv" 2 3keywords = [] 4 5CSV.foreach("keywords.csv") do |keyword| 6 keywords << keyword 7end 8 9 10keywords.each do |keyword| 11 if keyword.length == 3 12 puts "苗字は3文字です" 13 else 14 puts "苗字は3文字ではありません" 15 end 16end 17

試したこと

ベタ書きで"五十嵐".length == 3とするとうまく判定するのですが、
eachの変数を使用すると全ての苗字が(田中、鈴木)1と判定されてしまいます。
原因わかるかたいたら教えていただきたく!

###CSVの中身

/AB
1田中
2鈴木
3五十嵐
4よんもじ 
5ごごごごご
6

上記のような感じのCSVにしています。
テスト用に適当な苗字を入れたものです。
A4〜6は今扱っているデータの中にない文字数を擬似的に入れているものです。

DrqYuto👍を押しています

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

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

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

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

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

taichi730

2020/01/18 15:53

keywords.csv の中身も提示願います
kaori_oka

2020/01/19 03:58

taichi730さん、いつもありがとうございます。 CSVの中身を質問内容に追記しました 判定テストように1〜5文字のテキストがA列だけに入ったものになります。
guest

回答2

0

ベストアンサー

原因は、データが「3文字の文字列」ではないからです。

Ruby

1keywords.each do |keyword| 2 p keyword 3 if keyword.length == 3 4 puts "苗字は3文字です" 5 else 6 puts "苗字は3文字ではありません" 7 end 8end

と表示させれば、間違いに気づくと思います。
何が起こっているのかを確認するのがデバッグの第一歩です。

投稿2020/01/18 16:31

otn

総合スコア84538

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

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

kaori_oka

2020/01/19 04:06

ご回答ありがとうございます! ```["田中"]```のような形式で表示されましたので、 これを文字列として抽出する方法を調べてみます!
kaori_oka

2020/01/19 04:09 編集

CSVから読み取る部分を下記のように修正したら解決できました!! ``` CSV.foreach("keywords.csv") do |keyword| keywords << keyword[0] end ```
guest

0

3つの方法で書いてみました。
それぞれの差を研究してみてください。

c.rb

ruby

1# frozen_string_literal: true 2 3require 'csv' 4 5# --------- 6rows = [] 7 8CSV.foreach('keywords.csv') do |row| 9 rows << row 10end 11 12rows.each do |row| 13 if row[0].length == 3 14 puts '苗字は3文字です' 15 else 16 puts '苗字は3文字ではありません' 17 end 18end 19puts 20 21# --------- 22rows = CSV.read('keywords.csv') 23messages = rows.map do |row| 24 '苗字は3文字' + 25 case row[0].length 26 when 3 27 'です' 28 else 29 'ではありません' 30 end 31end 32puts(messages.join("\n")) 33puts 34 35# --------- 36rows = CSV.read('keywords.csv') 37messages = rows.map do |row| 38 '苗字は3文字' + (row[0].length == 3 ? 'です' : 'ではありません') 39end 40puts(messages.join("\n"))

実行例:
イメージ説明

投稿2020/01/19 08:38

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問