私は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
をしかし、それはこのようなものを作成:
私が欲しいものではありません。
先頭に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
'info.each'ループから' CSV.open'を移動します。 – slowjack2k
もちろん!ダー!愚かな私。パーフェクト、それは魅力のように働いた。それを答えとして追加するだけでいいですか?私はそれを受け入れます。ありがとう! – marcamillion
@ slowjack2k実際には、これが発生する1つのユースケースがあります。質問を更新しましたので、回答を追加する前にそれを確認して解決策を提案し、回答が完全であることを確認してください。ありがとう! – marcamillion