2016-10-23 5 views
0

私は、次の方法があります。このループを各ファイルの後ではなく、各行の反復後に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回書いてから、その行を適切に追加したいだけです。

このアプローチにはどのような方法が最適ですか?

+0

したがって、すべてのcsvデータを1つのファイルにヘッダーで書きたいと思っていますか? – Nikhil

+0

@Nikhilはい。データは2つの場所から得られます。 1つの部分は古いCSVから 'row'を介して来て、もう1つは'電子メールを作成するそれらの方法から来る。 – marcamillion

+0

古いcsvにはヘッダがありますか? – Nikhil

答えて

1

私はあなたが明示的にヘッダーを書くことができると思います。これはこれまでの私のコメントに基づいています。

headers = ["Company_Name","Website","Street_Address", "City", "State", "Zip", "Phone","Email1", "Email2", "Email3", "Email4", "Email5"] 
set_headers = true 

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+") do |new_csv_row| 
    new_csv_row << headers if set_headers 
    set_headers = false 
    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 
+0

@marcamillion:これは役に立ちますか? – Nikhil

+0

問題はヘッダーに関するものではありません。問題は新しいCSVの作成にあります。基本的には、それぞれの 'new_csv_row'が追加された後、' new_csv'ファイルを更新したいと思います。 – marcamillion

+0

'CSV.open(new_csv、" a + ")'は 'CSV.foreach(csv、headers:true)do | row |'ループ内で移動できますか? BTWどこで 'new_csv'ファイルを使用していますか – Nikhil

関連する問題