0

.importコマンドを使用してSqlite3にインポートしようとしているCSVファイルがあります。dbテーブルにはupdated_at列とcreated_at列がありますが、CSVファイルにはありません。そのため、インポートを実行すると、「予期された18列、16個しか見つかりませんでした」というエラーメッセージが表示されます。

このファイルをインポートする最も簡単な方法は何ですか?

created_at、updated_at列をCSVファイルに追加しようとしましたが、エラーが発生しました。

いくつかのフォーラムはFasterCSVの使用を提案していますが、この問題に具体的に対処するためにgemを使用する方法がわかりません。

4

2 に答える 2

2

ここで、ウィリアム、このコードを試してみてください。created_atとupdated_atを無視して、CSVをデータベースにインポートするのはRubyコードです。

それを実行するには:

  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を使用している場合は、「gem install」だけでなく、「sudo 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"

この方法でインポートしているときにどのようなエラーが発生しますか?

ライブラリを使用してデータをインポートする場合、GUIからレコードを追加する場合と同様に、インポートはActiveRecordインターフェイスを介して行われ、フィールドcreated_atとフィールドが自動的に追加されます。updated_at

コード例については、RubyonRailsの回答をご覧ください-CSVファイルからデータをインポートします。

また、ライブラリの使用方法については、 Rubyのcsv標準ライブラリ(以前はFasterCSVでした)を参照してください。

于 2013-02-10T04:22:06.927 に答える