2017-02-17 1 views
0

CSVに書き込もうとしていますが、問題が発生しました。私はthisを見たので、私はちょうど解決策を適用しましたが、エラーが発生します。 これは私のコードです:CSVに書き込むと、「 n」または「0」の未定義のメソッド `map '

require 'csv' 

data = Owner.find(2).cats 
CSV.open("file.csv", "w") do |csv| 
    data.each do |cat| 
    csv << cat.name 
    end 
end 

私はコンソールで確認していると私はデータfor Owner.find(2).catsを取得しています。 私CSVにこれを書こうとすると、私はエラーを取得:

undefined method `map' for 0:Fixnum

をと私は同じquestionからシンプルなソリューションしようとすると:

require 'csv' 

CSV.open("file.csv", "w") do |csv| 
    csv << "\n" 
end 

を、私はこのエラーを取得する:

undefined method `map' for "\n":String

私が間違っていることを知っていますか?

私はので、多分、私はroockieミスの1

+0

「データ」とは何ですか? 'Data.find()'は何を返しますか? '.cats'は何を返しますか? –

+0

@MarkReedわかりましたので分かりやすくなっています。 'Owner'は' cats'との関係を持っています。 'Owner'はhas_many:' cats'です。そして、猫は '名前'、 '年齢'を持っています... – kemis

答えて

1

CSVは、列のコレクションであるそれぞれの行のコレクション、ですがやってルビーに新しいです。これは2次元配列で、テキスト形式に変換されます。したがって、最上位のCSVオブジェクトは、個々のセル値ではなく配列を追加することを期待しています。

CSV.open('filename','w') do |csv| 
    do stuff 
end 

do stuffだけ正確に一度だけ実行されます。このコードで

注意。一例として、

CSV.open('filename','w') do |csv| 
    data.each |item| 
    row = [] 
    fields.each do |field| 
     row << item[field] 
    end 
    csv << row 
    end 
end 

CSV.open('filename','w') do |csv| 
    data.each |item| 
    row = [item.field1, item.field2, item.field3] 
    csv << row 
    end 
end 

あるいはダブルループ:

$ irb 
irb(main):001:0> require 'csv' #=> true 
irb(main):002:0> CSV.open("cats.csv", "w") do |csv| 
irb(main):003:1* csv << [ "cat1" ] << [ "cat2" ] << [ "cat3 " ] 
irb(main):004:1> end 
#=> <#CSV io_type:File io_path:"cats.csv" encoding:UTF-8 lineno:3 col_sep:"," row_sep:"\n" quote_char:"\""> 
irb(main):005:0> 
$ cat cats.csv 
cat1 
cat2 
cat3 
$ 

お知らせこれは通常、このようなもので、CSVの構造を作成するのはあなた次第ですファイルに引用符または角括弧が含まれていないことを確認します。

+0

ありがとうございます、しかし、私はcsvに書き込むときに「何か」があることを知っています:/ – kemis

+0

このCSVファイルで何をしようとしていますか?どのスプレッドシートプログラムも引用符で正しく解析します。 –

+0

私はそれをExcelで読むことができるようにしたいと思います。開いたときには、すべてが1行で表示されます。形式は – kemis

2
require 'csv' 

data = Owner.find(2).cats 
CSV.open("file.csv", "w") do |csv| 
    data.each { |cat| csv << [cat.name] } 
end 
+0

なぜこれが動作しているのか、なぜ 'csv <<" \ n "'が動作しないのか説明してください。私はそれにリンクされている質問に52 upvotesがあります。 – kemis

+0

これは、 'name_of_cat'だけでなく' [["name_of_cat"]] 'をcsvに入れます。 – kemis

+0

@kemis配列を追加する必要があります。 '[" \ n "]'は動作します。 – tadman

関連する問題