何千ものレコードを持つデータベースがあります
Code | Name | Price
00106 | Water | 9.99
00107 | Onion | 8.99
GES
以下のようなファイルにコード化されています。
00F
列ヘッダーを意味します00I
行を挿入することを意味します
他にも(00D
行の削除または00U
更新用)のようなものがあります
00F
0101
02Code
031
00F
0102
02Name
031
00F
0103
02Price
030
00I
0100106
02Water
030999
00I
0100107
02Onion
030899
このファイルを処理してデータベースにプッシュするインポーターを作成したいと考えています。だから私はそれを実装し始めました:
class Importer
CONN = ActiveRecord::Base.connection
F = "00F"
I = "00I"
def extract_to_database(collection)
add = true
tmp = []
type = F
inserts = []
collection.each_with_index do |line, i|
_type = line.strip
_changed = [F,I].include? _type
if _changed && i > 0
case type
when F then @f << tmp
when I
group_id = Group.find_by(code: tmp[1]).id
inserts.push "(group_id,'#{tmp[2]}','#{tmp[3]}')"
end
tmp = []
type = _type
end
tmp << line
end
sql = "INSERT INTO products (`group_id`, `name`, `price`) VALUES #{inserts.join(", ")}"
CONN.execute sql
end
end
これには 1 つの問題があります。関数型プログラミングを使用してリファクタリングしたいと思います。
また、他のモデルを見つけcode
てproducts
テーブルに関連するsome_model_id
列に配置する必要があるため、プロセス全体が複雑になる可能性があります。現在、このデータをインポートするには数時間かかるからです。
おそらく、Ruby を使用することは最善の選択肢ではありません。