在Ruby中读取CSV的最佳方法。 FasterCSV?

时间:2010-12-06 17:12:36

标签: mysql ruby csv fastercsv

我有一个CSV文件,我想用Ruby读取并创建Ruby对象以插入带有Active Record的MySQL数据库。最好的方法是什么?我看到两个明确的选择:FasterCSV& Ruby core CSV。哪个更好?我错过了更好的选择吗?

编辑:Gareth说使用FasterCSV,那么使用FasterCSV读取CSV文件的最佳方法是什么?查看文档,我看到名为parseforeachreadopen的方法......它表示foreach“用作主要界面用于读取CSV文件。“所以,我想我应该使用那个?

2 个答案:

答案 0 :(得分:4)

Ruby 1.9采用了FasterCSV as its core CSV processor,所以我觉得去FasterCSV肯定会更好,即使你还在使用Ruby 1.8

答案 1 :(得分:1)

如果要导入大量记录,可能需要使用MySQL's loader。它会非常快。

  

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