0

我有一个 CSV 文件,我正在尝试使用 .import 命令导入 Sqlite3。db 表有 updated_at 和 created_at 列,但我的 CSV 文件没有,所以当我运行导入时,我收到一条错误消息:“预期 18 列,仅找到 16”

导入此文件的最简单方法是什么?

我尝试将 created_at、updated_at 列添加到 CSV 文件,但出现错误。

几个论坛建议使用 FasterCSV,但我不清楚如何使用 gem 来专门解决这个问题。

4

2 回答 2

2

在这里,威廉,试试这个代码。将 CSV 导入数据库是 Ruby 代码,忽略 created_at 和 updated_at。

要运行它:

  1. 将代码粘贴到新文件中。我们称之为 import.rb
  2. 编辑文件。将单词“mytablename”更改为self.table_name = "mytablename"您要导入的表的实际名称。
  3. 在文件末尾附近,将 mydb.db 替换为 Sqlite3 文件的实际名称。它应该是文件的相对路径(相对于 import.rb)。
  4. 在命令行上,键入:

    gem install active_record sqlite3
    ruby import.rb path/to/csvfile.csv
    

(如果您使用的是 Mac,请使用“sudo gem install”而不是“gem install”。)

好的,代码如下:


require 'rubygems'
require 'csv'
require 'active_record'
require 'sqlite3'

ActiveRecord::Base.configurations = YAML::load(DATA)
ActiveRecord::Base.establish_connection('development')

class Record < ActiveRecord::Base
  self.table_name = "mytablename" # <=== REPLACE THIS with your table name
end

CSV.foreach ARGV[0], :headers => true do |row|
  print "."
  hash = Hash[row]
  hash.delete("updated_at")
  hash.delete("created_at")
  Record.create! hash
end

puts "\nDone."

__END__
development:
  adapter: sqlite3
  database: mydb.db  # <=== REPLACE THIS with a relative path to your sqlite3 DB
  pool: 5
  timeout: 5000
于 2013-02-10T05:02:41.103 回答
0

created_at如果和的值updated_at在 CSV 中添加如下,.import xyz.csv xyz则应正确导入数据。

... | "2013-02-10 15:17:17" | "2013-02-10 15:17:17"

以这种方式导入时遇到什么错误?

当您使用库导入数据时,导入通过 ActiveRecord 接口进行,该接口自动添加created_atupdated_at字段,就像您从 GUI 添加记录时一样。

查看Ruby on Rails - Import Data from a CSV file的答案以获取代码示例。

有关使用该库的信息,请参阅Ruby 的 csv 标准库(以前是 FasterCSV)

于 2013-02-10T04:22:06.927 回答