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

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

詳細はこちら
Ruby

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

Q&A

解決済

3回答

697閲覧

[Ruby]テキストファイルの中身の整形を行いたい

yomigi

総合スコア43

Ruby

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

0グッド

0クリップ

投稿2019/10/10 09:16

"hoge": 1, "hoge": 2, "hoge": 3,

となっているテキストファイルから

1,2,3

となっている形式で別のファイルに書き出したいです。
初歩的な質問で申し訳ありませんが、こちらご教授願えないでしょうか。。

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

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

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

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

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

guest

回答3

0

str = File.read("orignal.txt").gsub(/^.*?:/,"").gsub(/\n/,"")
File.write('converted.txt',str)

ちょっと短くできた
str = File.read("orignal.txt").gsub(/(^|\n)(.*?:)?/,"")

もし、最後に改行が有っても良い、若しくは有ったほうが良いのでしたら
str = File.read("orignal.txt").gsub(/(^|\n).*?:/,"")

頭と終わりか、、、ながくなっちまったな。汚い。も少し楽しんでみます
File.read("orignal.txt").gsub(/(^|\R).?:/,"").sub(/\s/,"").sub(/,\R/,"")

[1..-1] が汚い
File.read("orignal.txt").split(/[^\d]+/)[1..-1].join(", ")

投稿2019/10/10 13:06

編集2019/10/10 14:44
winterboum

総合スコア23567

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

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

Mugheart

2019/10/10 14:16

そのコードでは要素の頭のスペースと末尾のカンマが除去できていません。
guest

0

ruby

1res = File.read('sample.txt').split("\n").map do |line| 2 line.split(':').last.chop.strip 3end 4 5File.write('out.txt', res.join(',')) 6

投稿2019/10/10 10:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Mugheart

2019/10/10 14:15

> line.split(':').last.chop.strip 行末次第で意図しない値になりそうなのが怖いですね。 例えばカンマがないとか空白があるとか line.split(':').last =~ /\d/; $& こっちの方が意図しない値になりにくそうです。
退会済みユーザー

退会済みユーザー

2019/10/10 14:33

ご指摘ありがとうございます。 でも、未知の仕様に対応するなら eval の方が怖くないですか? sample.txt が以下の場合、カレントディレクトリのファイルを削除できますよ。 a: ?a};Dir.glob('*.*') { |e| File.delete(e) };{a: ?a
Mugheart

2019/10/10 14:36

そうなんですよね、おっしゃる通りなんですけど。 sample.txtがあくまで自分の用意したファイルなら問題ないかなと思っていたというのと、 パッと思いついたのがあのコードなのでもともと最高のコードではないとは思ってました。 まぁ難しいところですよね、サンプルファイルから1,2,3を出力する条件さえ満たせばいいのなら File.read('sample.txt').scan(/\d/).join(',') の一行で済んでしまうので何をどこまで考慮するか次第ですかねぇ...。
退会済みユーザー

退会済みユーザー

2019/10/10 14:48

私も、自分で用意したファイルの場合は内容を把握できる想定です。 なので、上で示されていない仕様については対応していません。 同じく、未知の仕様にも対応できる最高のコードを書くつもりはなかったです。
winterboum

2019/10/10 14:53 編集

そか、scanか。  scan(/\d+/).join(', ') ですね
guest

0

ベストアンサー

txt

1

"hoge": 1,
"hoge": 2,
"hoge": 3,

sample.txtとすると以下のようなコードで

rb

1puts File.read('sample.txt').gsub(/[",,]/, '').split("\n") 2 .map{ |x| eval("{#{x}}").values }.join(',')
1,2,3

と出力できます。
File.readでファイルの中身を取り出し、gsubで不要な文字を消し、splitで分割して、evalで無理やりHashの形にして、joinで結合して出力しています。

雑に書いたのでもっといい書き方があるかもしれませんが、これをputsで出力するのではなく、新しくファイルに書き込むようにすれば目的は果たせると思います。

書き方については色々あります。
条件さえ満たせばいいのか、他に考慮すべきことがあるのか次第です。
他の方も回答を考えてくださっているので、要件に一番合いそうなものを参考にすれば良いと思います。

投稿2019/10/10 09:45

編集2019/10/10 14:42
Mugheart

総合スコア2349

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

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

yomigi

2019/10/11 04:53

回答者さまがたの間で、私が意図していないレベルの議論が繰り広げされていて驚きました。。。 みなさま、ありがとうございました。 迷いましたが、一番に回答をくださったこと及び詳しい説明を書いてくださった点から、こちらの回答をBAとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問