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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

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

Q&A

解決済

1回答

5374閲覧

rubyでcsvを読み込んで重複している行を削除した新しいcsvファイルの作成

yoshimitsu41

総合スコア36

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

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

0グッド

0クリップ

投稿2017/05/24 09:44

ruby初心者です。

old.csvを読み込んでidが重複する行を削除した
新しいnew.csvというファイルを生成したい。
と言った内容になります。

例えば…

idtextprice
111グッド1000
222ベリーグッド2000
333ダメ500
111グッド1000

上記のようなold.csvがあったとして
rubyを使って

idtextprice
111グッド1000
222ベリーグッド2000
333ダメ500

というnew.csvを生成したいということです。
idが111の重複行を削除するということです。

現状は下記のような状態です。

ruby

1require 'csv' 2 3puts "start..." 4intro_csv = CSV.generate do |csv| 5 CSV.foreach('old.csv', headers: true) do |data| 6 intro_msg = [ 7 data["id"], 8 data["text"], 9 data["price"], 10 ] 11 if #ここに重複したidをnextするための記述?ここをどうすればいいのか…。そもそもこのやり方でいいのか不明…。 12 next 13 end 14 csv << intro_msg 15 end 16end 17 18File.open("new.csv", 'w') do |file| 19 file.write(intro_csv) 20end 21 22puts "complete! See new.csv."

intro_msgに配列で入れることは出来るのですがその後にidが重複した場合に飛ばす処理の仕方がわかりません。
どなたかご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

CSVのデータを id をキーとしたハッシュとして持たせて、そのidが既に存在するかチェックすれば良いと思いました。

ruby

1require 'csv' 2 3rows = {} 4CSV.foreach('old.csv', headers: true) do |row| 5 rows[row['id']] = row if !rows.key?(row['id']) 6end 7 8CSV.open('new.csv','w') do |newcsv| 9 rows.each_value do |row| 10 newcsv << row 11 end 12end

投稿2017/05/24 10:11

編集2017/05/24 10:25
tell_k

総合スコア2120

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

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

yoshimitsu41

2017/05/24 10:20

ご回答ありがとうございます。 tell_kさんのコードで試したところ「重複したデータだけのcsv」ファイルができてしまいました。 やりたいこととしては重複したデータは一つにしてしまうということになります。 idが[111][222][333][111]という値がold.csvにあったときに new.csvでは[111][222][333]の情報にしたいということになります。 どのように修正すればよろしいでしょうか?
tell_k

2017/05/24 10:27

本当ですか? 少なくとも私の手元では期待通りの結果になっています。 どのように試したのか質問文に追記してもらえれば何かわかるかもしれません。
yoshimitsu41

2017/05/24 10:42

すみません!期待通りの動きになってました! ありがとうございました!
tell_k

2017/05/24 14:32

よかったです。連絡ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問