2016-10-07 14 views
0

私はinfoという配列を持っており、各行をCSVに追加したいのですが、ファイルの先頭にヘッダーも含めたいと思います。CSVが各行の後にヘッダーを書き込むのはなぜですか?

私はこれでした:

info.each do |listing| 
    CSV.open(csvfile, "a+", write_headers: true, headers: ["Company_Name","Website","Street_Address", "City", "State", "Zip", "Phone","Email"]) do |csv| 
     csv << listing 
    end 
    end 

をしかし、それはこのようなものを作成:

enter image description here

私が欲しいものではありません。

先頭に1行のヘッダーが必要です。

どうすればよいですか?

編集1

私は実際には同じ問題を抱えている他のネストされたループを持っていますが、私は単純にループの外に移動することはできません - ので、どのように他の私はこの1つに取り組むのでしょうか?第二のために

CSV.open(csvfile, "a+", write_headers: true, headers: ["Company_Name","Website","Street_Address", "City", "State", "Zip", "Phone","Email"]) do |csv| 
    info.each do |listing| 
    csv << listing 
    end 
end 

header_written = {} # memorize if header is allready written 
csvs.each do |csv| 
    ... 
    # alternative can be 'write_headers: !File.exist?(new_csv)' 
    # but this works only when this file is created here and no empty file exists 
    CSV.open(new_csv, "a+", write_headers: !header_written[new_csv], headers: ["Company_Name","Website","Street_Address", "City", "State", "Zip", "Phone","Email"]) do |new_csv_row| 
      new_csv_row << row 
      puts "#{row['Email']} successfully added to #{new_csv}" 
    end 
    header_written[new_csv] ||= true 

編集:私はちょうど今new_csvが動的ではないことを認識しなかった最初のものはループを変更するために

csvs.each do |csv| 
    CSV.foreach(csv, headers: true) do |row| 
     #check for presence of valid email 
     if (!row['Email'].nil?) && (!row['Email'].include? "no email") 
     CSV.open(new_csv, "a+", write_headers: true, headers: ["Company_Name","Website","Street_Address", "City", "State", "Zip", "Phone","Email"]) do |new_csv_row| 
      new_csv_row << row 
      puts "#{row['Email']} successfully added to #{new_csv}" 
     end 
     end 
    end 
    end 
+4

'info.each'ループから' CSV.open'を移動します。 – slowjack2k

+0

もちろん!ダー!愚かな私。パーフェクト、それは魅力のように働いた。それを答えとして追加するだけでいいですか?私はそれを受け入れます。ありがとう! – marcamillion

+0

@ slowjack2k実際には、これが発生する1つのユースケースがあります。質問を更新しましたので、回答を追加する前にそれを確認して解決策を提案し、回答が完全であることを確認してください。ありがとう! – marcamillion

答えて

3

。したがって、2番目のCSV.openコールをループ外に配置するか、header_written[]の代わりに単純なフラグを使用して、header_written = false|trueに変更することができます。

+0

また、 'each_with_index'と特別な場合のインデックス0を行うこともできます。 – tadman

+0

' if'命令のためにインデックス0が動作しないと思います。最初のインデックスにcsvファイルが作成されているとは限りません。 – slowjack2k

+0

私はあなたが無視することができます残りのインデックス0でヘッダーを出力する必要があることを意味します。次のように: 'write_headers:index == 0' – tadman

関連する問題