我有大约50个CSV文件需要水平合并到一个CSV中。
标题可以忽略。稍微简化了文件的样子:
文件1:
1,2,4,5,6
4,5,68,7,4,2
1,2
1,2,3
文件2:
1,2,4
4,5,6,4
3,4,5
3,4,5
输出应如下所示:
1,2,4,5,6,1,2,4
4,5,68,7,4,2,4,5,6,4
1,2,3,4,5
3,4,5
1,2,3
合并文件的顺序也不重要。我知道如何垂直合并它们,但我不知道如何水平合并。 我用嵌套数组想到了类似的东西,但它不起作用,但我不知道为什么。看起来数据数组似乎不接受行数组。
#!/usr/bin/env ruby
require 'csv'
data = Array.new
filecount=1
linecount=1
CSV.open("output.csv", "wb") do |output|
Dir.glob('*.csv').each do |each|
next if each == 'output.csv'
file = CSV.read(each)
file.each do |line|
data[filecount][linecount] = line
linecount=linecount+1
end
filecount=filecount+1
end
end
puts data
答案 0 :(得分:2)
我准备了一个小脚本来解决你的问题,并添加了一些评论以便更好地解释。
主要思想是逐行捕获输入,这样就不必占用太多内存。
#!/usr/bin/env ruby
require 'csv'
# map "treats" each element of the array with the block
files = Dir.glob('csv/*.csv').map { |file| CSV.open file, 'r' }
CSV.open("output.csv", "wb") do |out|
loop do
# shift returns the next line
# compact remove nil entries
line = files.map { |file| file.shift }.compact
# remove entry if file has no row
line.reject! { |e| e.empty? }
# break the endless loop if no input to handle
break if line.empty?
out << line.flatten
end
end