首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将动态数据列追加到多个CSV

将动态数据列追加到多个CSV
EN

Stack Overflow用户
提问于 2019-06-19 20:57:51
回答 2查看 202关注 0票数 0

我有一个下载多个CSV的脚本,所有CSV都有相似的名称(例如,data.csv,data(1).csv),我想向每个CSV追加一列,然后将它们组合成一个CSV。

举个例子,

data.csv有4个头文件(header_1、header_2等),我想用变量foobar添加header_5。对于data.csv,foobar是“鸭子”,因此对于data.csv的每一行,header_5都会有那么多的鸭子。

数据(1).csv是相同的,但是这个时间变量foobar现在是“狗”。该脚本将在header_5中填充任意数量的狗。

在最后一步,两个CSV将被合并--保留修改后的数据--成为一个巨大的CSV。

我已经想了很长时间了。我对Ruby了解不多,这种问题对我来说是新的,所以我希望我能很好地解释它。

我想过首先修改CSV以获得新的数据列,然后合并它们,但我一直遇到CSV名称的问题。为了让我修改这些文件,我需要知道这些文件的名称,所以我想到了通配符。但是,我如何区分CSV呢?它可能会覆盖数据。

我当前的代码就有这个问题。

 def CSV_Creation (source)


        input_files = Dir.glob("data*.csv")

        all_headers = input_files.reduce([]) do |all_headers, file|
            header_line = File.open(file, &:gets)
            all_headers | CSV.parse_line(header_line)
        end


        CSV.open("out.csv", "a+") do |out|
            all_headers << "Source"
            out << all_headers 


            input_files.each do |file|
                CSV.foreach(file, headers: true) do |row|
                    out << all_headers.map { |header| row[header] }



                end
            end
        end
    end

  • 源参数根据要下载的CSV而变化
  • 我使用通配符收集所有CSV,收集报头以添加另一个报头,并将所有数据转储到新的CSV中。当然,数据也会被覆盖。

我不能完全确定如何防止最后一列中的数据不被覆盖。

编辑

感谢您到目前为止的所有回复。我已经更新了代码,希望这些代码更有意义:

def CSV_Creation (source)



        l_source = {'lead_source' => "#{source}"}

        input_file = Dir.glob("data*.csv").last



        puts "Here is " + input_file


        rows = CSV.open(input_file, headers: true).map{ |row| row.to_h }


        rows.each { |h| h.merge!(l_source)}
        headers = rows.first.keys
       rows.first.keys.each {|k| puts k}



        csv_response = CSV.generate do |csv| 
            csv << headers
            rows.each do |row|
                csv << row.values_at(*headers) 
            end
        end
        File.open("#{source}.csv", "w") {|file| file.write(csv_response)}


    end 

这将创建具有适当列和数据的两个不同的csv文件。现在我只需要弄清楚如何组合这两个文件。

第二次编辑

这就是最终代码的样子。它做到了我所要求的,所以我想它是正确的?

 def CSV_Creation (source)



        l_source = {'lead_source' => "#{source}"}

        input_file = Dir.glob("data*.csv").last



        puts "Here is " + input_file


        rows = CSV.open(input_file, headers: true).map{ |row| row.to_h }


        rows.each { |h| h.merge!(l_source)}
        headers = rows.first.keys
       rows.first.keys.each {|k| puts k}



        csv_response = CSV.generate do |csv| 
            csv << headers
            rows.each do |row|
                csv << row.values_at(*headers) 
            end
        end
        File.open("#{source}.csv", "w") {|file| file.write(csv_response)}


        input_files = Dir.glob("#{source}*.csv")


        all_headers = input_files.reduce([]) do |all_headers, file|
            header_line = File.open(file, &:gets)
            all_headers | CSV.parse_line(header_line)
        end

        CSV.open("out.csv", "a+") do |out|
            out << all_headers 

            input_files.each do |file|
                CSV.foreach(file, headers: true) do |row|
                    out << all_headers.map { |header| row[header] }
                end
            end
        end







    end 

非常感谢给我建议的每一个人!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56668220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档