2016-10-06 5 views
0

私はヘッダーのないCSVファイルの束を持つディレクトリを持っています。既存のCSVにヘッダを書き込むにはどうすればよいですか?

私はこのようにそれをやってみました:

def add_headers_to_csvs 
    csvs = Dir["#{@dir_name}/#{@state}/*.csv"] 
    csvs.each do |csv_file| 
    CSV.open(csv_file, "a+", write_headers: true, headers: ["Company_Name","Website","Street_Address", "City", "State", "Zip", "Phone","Email"]) do |csv| 
    end 
    end 
end 

私はwrite_headersheaders:オプションが機能することを期待していた、それはしません。

私は何をしようとしていますか?

答えて

3

特に、追加モードを使用して、それらを適切に再オープンすることはできません。新しいファイルを開き、ヘッダーを書き、元のデータをすべて追加する必要があります。今、あなたは絶対にあなたの元のデータのバックアップを持っているしたいと思う何かが恐ろしくうまくいかない場合には

CSV.open(csv_file + '.tmp', 'w', write_headers: true, headers: [ ...]) do |dest| 
    # Transpose original data 
    CSV.open(csv_file) do |source| 
    source.each do |row| 
     dest << row 
    end 
    end 
end 

# Swap new version for old 
File.rename(csv_file + '.tmp', csv_file) 

通常は、ある種の一時ファイルでこれを行うと思います。

+0

私は避けようとしていたものです。一番上に1行追加するだけで、CSVファイル全体を再構築する必要がありますか? CSVファイルの 'i [0]'の位置に新しい行を張る方法はありませんか? – marcamillion

+0

これはファイルの仕組みではなく、データを「挿入」したり、バイトを魔法のように動かしたりすることはできません。追加は簡単です。保留中のファイルには、多くの作業が含まれ、通常はファイル全体の書き換えが行われます。 – tadman

+0

興味深い。 Ok ...私はこのアプローチを検討します。 – marcamillion

関連する問題