🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

解決済

2回答

1162閲覧

Rubyで読み込んだファイルを読みだして1行ずつ比較したい

mzr

総合スコア5

Ruby

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

0グッド

1クリップ

投稿2019/10/02 06:26

前提・実現したいこと

Rubyで入力されたファイルを読み出し1行ずつ比較して別のファイルに書き出したいですがうまくいきません。どうやって1行ずつ読み込んで比較したらいいのかわかりません。

例えば入力ファイルを

aaa bbb ccc aaa ccc bbb aaaa

とすると、一行目と二行目を比べて一列目(ここではaaa)が同じだったら後者を消すという動作をしていきたいです。

理想↓

aaa bbb ccc bbb aaaa

発生している問題・エラーメッセージ

test.rb:9:in `block (3 levels) in <main>': private method `readlines' called for "aaa bbb ccc\n":String (NoMethodError) from test.rb:7:in `each' from test.rb:7:in `block (2 levels) in <main>' from test.rb:6:in `open' from test.rb:6:in `block in <main>' from test.rb:5:in `open' from test.rb:5:in `<main>'

該当のソースコード

Ruby

1# -*- coding: utf-8 -*- 2line2=[] 3s=[] 4line3=[] 5open("test.txt", "r:UTF-8"){|file| 6 open("./test2/test2.txt", "w:UTF-8"){|file2| 7 file.each{|line| 8 line3 = line 9 s = line3.readlines 10 if s[0] != line2[0] then 11 line2[0] = s[0] 12 file2.puts line 13 else 14 end 15 } 16 } 17}

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

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

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

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

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

guest

回答2

0

open が二重になっています。これは何かの間違いとおもうので、内側のopenが無いものとして見てみます。

file.each{|line|
line3 = line

で、line3には "test.txt" のデータが1行読み込まれますから、String "aaa bbb ccc\n" が入っています。ですので
s = line3.readlines
で、そんなmethodがないというエラーとなります。

1行めをline1に読み込み、splitして1カラム目を clmn1に取る
以降1行づつ line2に読みこみ、1カラム目をclmn2に取る
・clmn1==clmn2だったらなにもしない
・clmn1≠clmn2だったたら
・・line1を出力
・・line1,clmn1の内容をline2,clmn2に置き換える
全部読み終わったら line1を出力

みたいにしたらどうでしょう

投稿2019/10/02 06:52

winterboum

総合スコア23567

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

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

mzr

2019/10/02 07:08

ありがとうございます。試してみます!
guest

0

ベストアンサー

file.each{|line| の時点で line には一行分の文字列が入っています。
また、列ごとに分解するには split メソッドが便利です。
わからなくなったら p 変数名 として少しずつ確認しながら行うと良いです。

投稿2019/10/02 06:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mzr

2019/10/02 07:06

できました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問