1

我有以下 csv 文件:

NAME, DOB, SCORE
Robert Shine, 12/25/1980, 15
Marry Shine, , 15

我想通过 Rails 迁移将它导入到 postgresql

在 Rails 中:

class Cases < ActiveRecord::Migration
  def change
    create_table :cases do |t|
        t.string :name
        t.date :dob
        t.int :score
  end
end

class ImportData < ActiveRecord::Migration
   def change
      execute "COPY cases FROM 'path/to/file.csv'
               WITH (FORMAT csv, DELIMITER ',',  NULL '');"
   end
end

但是,这不起作用,因为第一列是文本,但没有引号。我怎样才能强制 postgresql 阅读这个?

4

1 回答 1

3

我不认为缺乏引用是你的问题。我看到两个问题:

  1. 你还没有告诉 PostgreSQL 标题行。
  2. null ''不会产生' 'NULL。

第一个问题很简单,只需添加header true选项:

HEADER
指定文件包含带有文件中每一列名称的标题行。输出时,第一行包含表中的列名,输入时,第一行被忽略。仅当使用 CSV 格式时才允许使用此选项。

第二个有点棘手。您有null '',但第二个日期实际上将被视为' '. 如果第二行是这样的:

Marry Shine,, 15

然后你会得到预期/期望的 NULL 。如果您使用null ' '该问题应该消失。我还建议切换到 ISO 8601 日期格式以避免歧义和对日期设置的依赖。

尝试使用此 COPY 命令:

COPY cases FROM 'path/to/file.csv' WITH (FORMAT csv, DELIMITER ',',  NULL ' ', HEADERS true)

还要记住,COPY 假定有问题的文件位于数据库服务器的文件系统中,因此这可能不适用于您的生产环境。

于 2013-06-28T22:45:49.977 回答