3

大学を検索用にIDコードに一致させる単純な4列のExcelスプレッドシートがあります。ファイルはかなり大きい(300k)。

Railsアプリでこのデータを入力済みのテーブルに変換する方法を考え出す必要があります。問題は、これが時々更新されるドキュメントであるため、1回限りの解決策ではないということです。理想的には、ファイルを読み取り、エントリを自動的に作成する、ある種のルビースクリプトであるため、新しいバージョンが電子メールで送信されたときに、自動的に更新できます。それが重要な場合は、Herokuを使用しています。

どうすればこのようなことを達成できますか?

4

2 に答える 2

3

可能であれば、スプレッドシートを CSV として保存してください。Excel スプレッドシートを解析するよりも、CSV ファイルを解析する方がはるかに優れた gem があります。この種の問題を処理する効果的な方法は、CSV ファイルを読み取り、必要に応じてすべてのレコードを作成する rake タスクを作成することです。

たとえば、古いがまだ効果的なFasterCSV gemを使用して、ファイルからすべての行を読み取る方法を次に示します。

data = FasterCSV.read('lib/tasks/data.csv')
columns = data.remove(0)
unique_column_index = -1#The index of a column that's always unique per row in the spreadsheet
data.each do | row |
  r = Record.find_or_initialize_by_unique_column(row[unique_column_index])
  columns.each_with_index do | index, column_name |
    r[column_name] = row[index]
  end
  r.save! rescue => e Rails.logger.error("Failed to save #{r.inspect}")
end

ただし、元のスプレッドシートに一意の列があることに依存しています。

それを rake タスクに入れると、それを Capistrano デプロイ スクリプトに接続できるので、デプロイするたびに実行されます。find_or_initialize は、重複したレコードを取得しないようにする必要があります。

于 2010-06-15T20:33:30.943 に答える
1

Hpricot を使用すると、新しい Excel ファイルを解析するのにそれほど問題はありません。これにより、2 次元配列が得られます。

require 'hpricot'

doc  = open("data.xlsx") { |f| Hpricot(f) }
rows = doc.search('row')
rows = rows[1..rows.length] # Skips the header row

rows = rows.map do |row|
    columns = []
    row.search('cell').each do |cell|
        # Excel stores cell indexes rather than blank cells
        next_index          = (cell.attributes['ss:Index']) ? (cell.attributes['ss:Index'].to_i - 1) : columns.length
        columns[next_index] = cell.search('data').inner_html
    end
    columns
end
于 2010-06-15T20:52:37.587 に答える