1

次の csv ファイルがあります。

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

これを Rails migration 経由で postgresql にインポートしたい

レールでは:

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

引用がないことはあなたの問題ではないと思います。2 つの問題があります。

  1. ヘッダー行について PostgreSQL に通知していません。
  2. null ''' 'NULLにはなりません。

最初の問題は簡単です。header trueオプションに追加するだけです。

HEADER
ファイル内の各列の名前を含むヘッダー行がファイルに含まれていることを指定します。出力では、最初の行にテーブルの列名が含まれ、入力では最初の行は無視されます。このオプションは、CSV 形式を使用する場合にのみ許可されます。

2 つ目は少しトリッキーです。持っていますnull ''が、2 番目の日付は実際には と見なされ' 'ます。2 行目が次の場合:

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 に答える