RubyでCSVファイルのいくつかの列のコピーを作成し、1つの列に異なるデータを含めるにはどうすればよいですか?


84

「A.csv」というCSVファイルがあります。「A.csv」のデータを使用して「B.csv」という新しいCSVファイルを生成する必要があります。

「A.csv」の列のサブセットを使用し、1つの列の値を「B.csv」の新しい値に更新する必要があります。最終的には、B.csvのこのデータを使用して、データベースに対して検証します。

  1. 新しいCSVファイルを作成するにはどうすればよいですか?
  2. 必要な列のデータをA.csvから「B.csv」にコピーするにはどうすればよいですか?
  3. 特定の列に値を追加するにはどうすればよいですか?

Rubyは初めてですが、CSVを読み取って配列またはハッシュを取得できます。


2
問題解決に向けた取り組みを示すなど、基本的な情報が不足しています。この情報はCSVドキュメントにあります。「質問方法」と「最小限の再現可能な例」をお読みください。
ブリキの

回答:


191

mikebが指摘したように、ドキュメントがあります- http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html -それとも、(すべてがテストされ、以下の例と一緒に従うことができますし、ワーキング):

新しいファイルを作成するには:

このファイルには、ヘッダー行とデータ行の2つの行があり、非常に単純なCSVです。

require "csv"
CSV.open("file.csv", "wb") do |csv|
  csv << ["animal", "count", "price"]
  csv << ["fox", "1", "$90.00"]
end

結果として、次の「file.csv」というファイルが作成されます。

animal,count,price
fox,1,$90.00

CSVにデータを追加する方法

「wb」モードを使用する代わりに、上記とほぼ同じ式を使用し、「a +」モードを使用します。これらの詳細については、このスタックオーバーフローの回答を参照してください:Ruby File.openモードとオプションは何ですか?

CSV.open("file.csv", "a+") do |csv|
  csv << ["cow", "3","2500"]
end

file.csvを開くと、次のようになります。

animal,count,price
fox,1,$90.00
cow,3,2500

CSVファイルから読み取る

これで、ファイルのコピーと書き込み、CSVの読み取り、および操作のためにデータを取得する方法がわかりました。

CSV.foreach("file.csv") do |row|
  puts row #first row would be ["animal", "count", "price"] - etc.
end

もちろん、これは、このgemを使用してCSVから情報を取得できる100種類の方法の1つに似ています。詳細については、入門書を入手したので、ドキュメントにアクセスすることをお勧めします:http//ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


すぐに書き込みをせずに開きたい場合はどうすればよいですか?ブロックを使用しないのですか?
ドナート

コピー&ペースト可能なコードをありがとう!-怠惰すぎて書けません。
DominikAngerer 2017年

これは、新しいCSVの作成をカバーしますが、使用可能なカンのサブセットをコピーしてそれらの値を変更または追加する要求に対処するのではなく、行全体の追加と読み取りに関する情報に進みます。私はOPと同じ種類のプロジェクトを持っていて、ドキュメントやこの回答に助けられなかったので、うまくいけば、ここに戻って、理解したらより具体的な回答を提供できます。
タイラージェームスヤング

3

RubyのCSVクラスを見たことがありますか?それはかなり包括的のようです。ここでそれをチェックしてください:http//ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


1
リンクをありがとう。私はそれを参照しているでしょう。ルビーでcsvファイルを編集できますか?つまり、csvの列値を更新できますか?後で必要な列のみのハッシュを取得しますか?
user1718712 2012年

0

あなたはおそらく使いたいでしょう CSV::parseRubyがCSVをデータのテーブルとして理解し、ヘッダーごとに値に簡単にアクセスできるようにするためすることをお。

残念ながら、メソッドに関する利用可能なドキュメントCSV::parse、この目的で実際に使用する方法が明確にさいません。

私も同様のタスクを実行し、RubyでCSVファイルを読み取って解析する方法によってさらに助けられましたし、CSVクラスのドキュメントやここからの回答よりもrubyguides.comでしてを読み取ってに役に立ちました。

そのページ全体を読むことをお勧めします。重要な部分は、以下CSV::Tableを使用して特定のCSVをオブジェクトに変換することです。

table = CSV.parse(File.read("cats.csv"), headers: true)

クラスに関するドキュメントCSV::Tableがありますが、rubyguides.comページの明確な例によってさらに役立つ場合があります。私が強調することの1つは、.parseヘッダーを期待するように指示すると、結果のテーブルはデータの最初の行を行として扱うこと[0]です。

あなたはおそらく.by_colあなたの新しいTableオブジェクトに利用可能なメソッドに特に興味があるでしょう。これにより、入力または出力、あるいはその両方の異なる列インデックス位置を反復処理し、一方から他方にコピーするか、出力に新しい値を追加することができます。動作するようになったら、戻って例を投稿します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.