1

1 つの CSV に水平方向にマージする必要がある約 50 個の 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
4

1 に答える 1

2

あなたの問題を解決する小さなスクリプトを用意し、より良い説明のためにいくつかのコメントを追加しました.

主なアイデアは、多くのメモリを使用する必要がないように、入力を 1 行ずつキャッチすることです。

#!/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
于 2013-03-04T17:52:47.517 に答える