2

Ruby で読み取り、Active Record を使用して MySQL データベースに挿入する Ruby オブジェクトを作成する CSV ファイルがあります。これを行う最善の方法は何ですか?FasterCSVRuby コア CSVという2 つの明確なオプションがあります。どちらが良いですか?私が見逃しているより良いオプションはありますか?

編集: Gareth は FasterCSV を使用するように言っていますが、FasterCSV を使用して CSV ファイルを読み取る最良の方法は何ですか? ドキュメントを見るとparseforeachreadopen…と呼ばれるメソッドがあり、 foreach「CSV ファイルを読み取るための主要なインターフェイスとして意図されている」と書かれています。だから、私はそれを使うべきだと思いますか?

4

2 に答える 2

4

Ruby 1.9ではコア CSV プロセッサとしてFasterCSV が採用されました。したがって、まだ Ruby 1.8 を使用している場合でも、FasterCSV を使用する方が確実に優れていると言えます。

于 2010-12-06T17:20:46.973 に答える
1

インポートするレコードが多い場合は、MySQL のローダーを使用することをお勧めします。非常に高速になります。

LOAD DATA INFILE を使用して、外部ソースから取得したファイルを読み取ることができます。たとえば、多くのプログラムは、データをカンマ区切り値 (CSV) 形式でエクスポートできます。この形式では、行にフィールドがカンマで区切られ、二重引用符で囲まれ、列名の最初の行が含まれます。このようなファイルの行がキャリッジ リターン/改行のペアで終了している場合、次に示すステートメントは、ファイルをロードするために使用するフィールドおよび行処理オプションを示しています。

LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'
  IGNORE 1 LINES;

入力値が必ずしも引用符で囲まれているとは限らない場合は、ENCLOSED BY キーワードの前に OPTIONALLY を使用してください。

それを使用してすべてを一時テーブルにプルし、次に ActiveRecord を使用してクエリを実行し、不要なレコードを削除してから、一時テーブルから本番テーブルにコピーしてから、一時テーブルを削除または切り捨てます。または、ActiveRecord を使用して一時テーブルを検索し、レコードを本番環境にコピーしてから、一時テーブルを削除または切り捨てます。MySQL 内でテーブルからテーブルへのコピーを実行したり、あるテーブルを別のテーブルに追加したりすることもできます。

専用ローダーの速度に勝るものはなく、データベースのクエリ メカニズムを使用してレコードを一括処理するのは難しいでしょう。CSV ファイルのレコードをオブジェクトに変換し、ORM を使用してそれをデータベースに書き込むステップは、余分なオーバーヘッドを追加するため、Ruby のロジックを必要とする非常に難しい検証がない限り、直進する方が速くなります。データベースに。


編集: これは、単純な CSV ヘッダーから DB 列マッパーへの例です。

require "csv"

data = <<EOT
header1, header2, header 3
1, 2, 3
2, 2, 3
3, 2, 3
EOT

header_to_table_columns = {
  'header1'  => 'col1',
  'header2'  => 'col2',
  'header 3' => 'col3'
}

arr_of_arrs = CSV.parse(data)
headers = arr_of_arrs.shift.map{ |i| i.strip }
db_cols = header_to_table_columns.values_at(*headers)
arr_of_arrs.each do |ary|
  # insert into the database using an ORM or by creating insert statements
end
于 2010-12-06T19:34:23.187 に答える