私は、次の方法があります。このループを各ファイルの後ではなく、各行の反復後にCSVに書き込むにはどうすればよいですか?
csvs = Dir["#{@dir_name}/#{@state}/*.csv"]
csvs.each do |csv|
city = csv.split(/[\/]|.csv-updated|.csv/).last
new_csv = "#{@dir_name}/#{@state}/emails/#{city}-with-emails.csv"
CSV.open(new_csv, "a+", write_headers: true, headers: ["Company_Name","Website","Street_Address", "City", "State", "Zip", "Phone","Email1", "Email2", "Email3", "Email4", "Email5"]) do |new_csv_row|
CSV.foreach(csv, headers: true) do |row|
website = row['Website']
begin
page = YPCrawler::PageParser.new website
links = page.compile_all_links(website)
emails = page.compile_all_emails(links)
new_csv_row << (row << emails.join(","))
rescue
next
end
end
end
end
しかし何が起こるが、それが処理された各行の新しいCSVへの書き込みはありません、それは全体のCSVファイルが処理された処理した後、それだけでそれをしないということです古いCSVファイル内の各行とは対照的です。私はそれが古いCSVファイルを処理してその結果をメモリに格納していると仮定し、そのCSVファイルが完了するとメモリからファイル全体にダンプします。 CSVファイルの長さが違うので、特に好きではありません。非常に多くのファイルを処理しているので、メモリが不足することはありません。
私は当初CSV.open(new_csv)
とCSV.foreach(csv)
を持っていましたが、問題は、すべての行の後に、私が望むものではないヘッダー行を書いていたことです。
ファイルの先頭にヘッダ行を1回書いてから、その行を適切に追加したいだけです。
このアプローチにはどのような方法が最適ですか?
したがって、すべてのcsvデータを1つのファイルにヘッダーで書きたいと思っていますか? – Nikhil
@Nikhilはい。データは2つの場所から得られます。 1つの部分は古いCSVから 'row'を介して来て、もう1つは'電子メールを作成するそれらの方法から来る。 – marcamillion
古いcsvにはヘッダがありますか? – Nikhil