【问题标题】:Best way to read CSV in Ruby. FasterCSV?在 Ruby 中读取 CSV 的最佳方式。更快的CSV?
【发布时间】:2011-05-21 02:55:07
【问题描述】:

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

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

【问题讨论】:

  • 我添加了 MySQL 标签以使其更明显

标签: mysql ruby csv fastercsv


【解决方案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

【讨论】:

    【解决方案2】:

    Ruby 1.9 采用了 FasterCSV as its core CSV processor,所以我想说,即使您仍在使用 Ruby 1.8,最好还是选择 FasterCSV

    【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2019-07-31
    • 2012-07-15
    • 2015-09-13
    • 1970-01-01
    • 2017-04-15
    相关资源
    最近更新 更多