我有一个下载多个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
我不能完全确定如何防止最后一列中的数据不被覆盖。
编辑
感谢您到目前为止的所有回复。我已经更新了代码,希望这些代码更有意义:
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
非常感谢给我建议的每一个人!
https://stackoverflow.com/questions/56668220
复制相似问题