Rubyで改行コードを削除するメソッドはchompです。しかし、ほぼ同じ機能chomp!メソッドやchopメソッドなどがあり、混同しがちです。そこで今回は、chompメソッドとchomp!メソッドの基本について、似ているメソッドと比較しながら解説します。
末尾の改行を削除する処理
テキストファイルを読み込んで処理に使用するプログラムがよく使われます。しかし、プログラムの中でそのテキストを使う場合、行の末尾にある改行コードを削除しなければなりません。もし、Rubyでテキストファイルを読み込む処理を作るなら、改行コードを削除することを考えてください。
まずは、テキストファイルの改行コードと、その削除手順を紹介します。
テキストの改行コード
テキストファイルは、文字コードが格納されたファイルですが、1行の終わりの必ず位置に改行コードが入っています。通常、テキストファイルから1行分を読み込み、それを分割してプログラム内で利用しますが、最後の文字列の後ろに改行コードが含まれると、意図した処理が動作しません。
また、改行コードは、WindowsやmacOSなどのOSによって違います。例えば、Windowsの改行コードは”\r\n”ですが、macOSの改行コードは”\r”、Linixの改行コードは”\n”など、全く違います。個別に対応すると、抜けが出るかもしれません。
そのため、プログラムの中でテキストファイルを利用する場合は、改行コードを削除するメソッドを利用します。
改行コードの削除は組み込む関数を使う
改行コードの削除は、Rubyなら文字列の置換で簡単に作れます。しかし、多くのプログラミング言語に、改行コードを削除する関数やメソッドが用意されているので、その関数を利用しましょう。
なお、Rubyの改行コードを削除する専用メソッドはchompです。
改行コードを削除する処理
先ほど説明したように、Rubyの改行コードを削除する専用メソッドはchompですが、改行コードを削除する処理をプログラムで書くのは難しくありません。例えば、Windows、macOS、Linuxで使われる改行コードをまとめて削除する処理は、gsub関数で次のように書けます。
文字列.gsub(/\R/."")
これは、文字列の置き換えをするメソッドのgsubに、正規表現を使って改行コードを削除する方法を使った例です。
ただし、正規表現を見て、処理内容をすぐに理解できる方は多くありません。そこで、組み込まれている関数やメソッドを利用することをお勧めします。先ほど、簡単に紹介したように、Rubyの場合は、shompメソッドを使います。
Rubyのchompを使った例 文字列.chomp
chmopメソッドの基本
次から、Rubyの改行コードを削除するchmodメソッドの文法や基本的な使い方などについて解説します。
chompの文法
chompは、Stringクラスのメソッドのため、文字列、または、文字列を格納した変数に対して使用します。また、chompの機能は、対象の文字列の末尾から改行コードを削除した新しい文字列の生成です。
なお、通常、”\r”, “\r\n”, “\n” のすべてを改行コードとみなして取り除きますが、引数に取り除く改行コードを指定することで、それだけを削除できます。
chmopの文法
文字列.chmop
または
文字列.chmop(改行コード)
なお、chompメソッドの対象になった文字列に、改行コードが含まれていない場合は、その文字列をそのまま返します。
簡単なchompの使用例 word = "Hello World\n".chmop p word
この例を実行すると、改行コードの「\n」が削除された「”Hello World”」が表示されます。
chompの使い方
chmodメソッドの使い方で最も解り易い例は、標準入力から入力された改行コードを含む文字列を、プログラムの中で処理するために、改行コードのみ削除するケースです。
標準入力から入力された文字列を加工する例 input_text = fgets datas = input_text.chomp arr = datas.split(" ") a = arr[0].to_i b = arr[1].to_i out = a + b puts out
この例は、標準入力からスペースで区切られた2つの数字を入力し、その2つの数字を足した数字を出力するプログラムです。そして、文字列を数字に変換する際に改行コードがあると数字に変換できないので、chompメソッドを使って改行コードを削除した後に、分割し、数字に変換しています。
chmop!メソッドの基本
先ほど、Rubyのchmodメソッドについて解説しましたが、「!」が付いたchomp!というメソッドもあります。次からchomp!メソッドについて解説します。
chomp!メソッドの文法
chomp!メソッドは、chompメソッドと同じくStringクラスのメソッドで、対象の文字列の末尾から改行コードを削除した新しい文字列を生成します。また、通常、”\r”, “\r\n”, “\n” のすべてを改行コードとみなして取り除き、引数に取り除く改行コードを指定することで、それだけを削除できる点もchompメソッドと同じです。
ただし、chompメソッドは改行コードがなければ文字列をそのまま返しましたが、chomp!メソッドはnilを返す点が違います。
chmopの文法
文字列.chmop!
または
文字列.chmop!(改行コード)
chomp!の使い方
chomp!メソッドは、もし、対象の文字列に改行コードが含まれている場合、nilを返すので、それを判定に使うことが可能です。
chomp!メソッドの使用例 str = "Hello World" out = str.chomp! if out.nil? then out = "改行コードが含まれていません" end puts out
この例は、改行コードを削除する処理にchomp!を利用し、その結果がnilだった場合に「改行コードが含まれていません」を表示します。
chompと似た機能のメソッド
Rubyには、文字列の最後の文字を削除するメソッドとして、今回紹介するchompメソッドとchomp!メソッドを含めて4つあります。
(1) chompメソッド
(2) chomp!メソッド
(3) chopメソッド
(4) delete_suffix
そして、それぞれ機能が違っており、使い方ももちろん違います。次から、これまで解説していない、chopメソッドとdelete_suffixについて解説します。
chompメソッドとchopメソッドの違い
chompメソッドは、文字列の最後にある改行コードを削除するメソッドですが、chopメソッドは、文字列の最後の文字を削除するメソッドです。そして、chopメソッドは、chompメソッドと同じく、Stringクラスのメソッドで、文字列または文字列を格納した変数に対して使用します。
chopメソッドの文法
文字列.chop
なお、文字列の最後に改行コードがある場合、chopメソッドはchompメソッドと同じく改行を削除します。例えばWindowsのテキストの改行コードは”\r\n”の2文字ですが、改行コードとしてまとめて削除します。
しかし、最後の文字が改行でない場合、chmopコマンドはその文字列をそのまま返しますが、chopメソッドは最後の文字を削除して返すので、利用する場合は注意してください。
chopメソッドの例 str = "Hello World" out = str.chop p out
この例の結果は、”Hello Worl”で、元の文字列から「d」が削除されて出力されます。
chompメソッドとdelete_suffixメソッドの違い
delete_suffixメソッドは、文字列の最後から、引数で指定した文字列を削除するメソッドです。
delete_suffixメソッドの文法
文字列.delete_suffix(削除する文字列)
そして、delete_suffixメソッドに、削除する文字列として改行コードを指定した場合、chompメソッドと同じ処理が可能です。
delete_suffixメソッドで改行を削除する例 str = "Hello World\n" out = str.delete_suffix("\n") p out
まとめ
Rubyのプログラムでテキストファイルを利用する場合、1行の末尾にある改行コードが処理を邪魔します。そのため、読み込んだ直後に改行コードを削除しなければなりません。そして、通常テキストファイルで読んだ文字列から改行コードを削除する場合、専用の関数やメソッドを使います。
Rubyでは、文字列から改行コードを削除するのにchompメソッドを使います。また、chomp!も機能は同じですが、違った使い方が可能です。
ぜひ、chompメソッドおよびchomp!メソッドの使い方をマスターしてください。また、Rubyには、chompと同じような機能のメソッドがよくあります。それらと混同しないようにしましょう。