2012-09-17 2 views
21

이 질문은이 포럼에서 많이 묻지 만 엄격한 기한을 지키고 있으며 도움이 필요하므로 조언이 필요합니다. 나는 Ruby on Rails에 익숙하지 않으므로 응답 할 때 염두에 두시기 바랍니다. 실행될 때 mysqlite db의 여러 테이블을 업데이트하는 rake 작업을 만들고 싶습니다. 이것은 db에 새 인시던트를 만드는 마이그레이션 파일입니다. 이 모든 정보를 CSV 파일을 통해 입력하는 레이크 작업을 어떻게 만듭니 까? 누군가가 처음부터 끝까지 갈퀴 파일을 쓰는 데 도움이 될 수 있습니까? 분명히 모든 문자열에 대해 모든 작업을 작성할 필요가 없으며 몇 가지 예제 만 제공하십시오. 그리고 실제 레이크 파일 외에도, 내 앱의 다른 부분에 코드를 추가해야합니까 (매우 일반적인 질문 인 것을 알고 있습니다. 코드를 추가해야하는 경우 어디에서 일반적인 설명을 읽어 주어야합니다). 나는 약간의 인도가 길을 갈 것이라고 느낍니다. 누군가 나에게서 더 이상의 정보가 필요하면 그냥 물어보십시오. lib 디렉토리/작업에서 프로젝트 폴더 아래레이크 작업을 통해 CSV 파일을 가져올 수 있습니까?

class CreateIncidents < ActiveRecord::Migration 
    def self.up 
    create_table :incidents do |t| 
     t.datetime :incident_datetime 
     t.string :location 
     t.string :report_nr 
     t.string :responsible_party 
     t.string :area_resident 
     t.string :street 
     t.string :city 
     t.string :state 
     t.string :home_phone 
     t.string :cell_phone 
     t.string :insurance_carrier_name 
     t.string :insurance_carrier_street 
     t.string :insurance_carrier_city 
     t.string :insurance_carrier_state 
     t.string :insurance_carrier_phone 
     t.string :insurance_carrier_contact 
     t.string :policy_nr 
     t.string :vin_nr 
     t.string :license_nr 
     t.string :vehicle_make 
     t.string :vehicle_model 
     t.string :vehicle_year 


     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :incidents 
    end 
end 
+0

이 유용하다 .... > http://stackoverflow.com/questions/3346108/how-to-write-rake-task-to-import- data-to-rails-app –

답변

20

코드

require 'csv' 
namespace :import_incidents_csv do 
    task :create_incidents => :environment do 
    "code from the link" 
    end 
end 

에게 다음 한 레이크 파일이 Ruby on Rails - Import Data from a CSV file

을 따르라고 "import_incidents_csv.rake의"레이크 파일을 생성 이 작업을 "rake import_incidents_csv : create_incidents"로 지정할 수 있습니다.

+0

내 문제는 오류없이 새 인시던트를 올바르게 만드는 레이크 파일을 넣을 코드를 모른다는 것입니다. 그러나 응답에 감사드립니다. – RubyDude1012

+0

첫 번째 행이 인시던트 테이블의 열 이름으로 csv 파일을 만들어야합니다. – Rubyman

+0

이것은 StackOverflow에서 발견 한 코드로, 내 애플 리케이션에 적응하려고 시도했다. import_csv가 은 'CSV' 이 csv_text = File.read ('C를 필요로 할 :/레일/엄지/I 문제 내림차순 죄송합니다 ... 그것은 비록 읽을 포맷하기 "한 줄 작업 설명" 작업을 데 incidents.csv ') csv = CSV.parse (csv_text, : headers => true) csv.each do | row | 행 = row.to_hash.with_indifferent_access Incidents.create! (row.to_hash.symbolize_keys) 단부 단부 – RubyDude1012

2

다음은 rake db : seed를 사용하여 가져온 CSV 예제입니다. 이 파일을 seeds.rb 파일에 작성하고 CSV 파일을 /public/seed_data/zip_code.csv에 넣습니다. 그것은 꽤 자명하다. (즉, csv에는 code, long, lat의 세 컬럼이있다.

코드는 각 라인을 분석하고, 해당 데이터를 추출하여 로컬 변수에 할당 한 다음 레코드에 기록한다. 도움 나는 다음을 수행하여 작업 시간 및 시간 어느 날 마침내 그것을 가지고이 근무

File.open("#{Rails.root}/public/seed_data/zip_code.csv") do |zip_codes| 
    zip_codes.read.each_line do |zip_code| 
    code, longitude, latitude = zip_code.chomp.split(",") 
    # to remove the quotes from the csv text: 
    code.gsub!(/\A"|"\Z/, '') 
    # to create each record in the database 
    ZipCodeGeo.create!(:zip_code => code, :longitude => longitude, :latitude =>  latitude)    
    end 
end 
11

:. 반사 된 내 csv 파일에 첫 번째 행의

  1. 추가 헤더를. 내 모델의 attr_accessible입니다. 제 경우 내 모델은 attr_accessible입니다., :name 그리고 내 CSV 파일에서 첫 번째 줄은 이름 인트로를 읽었습니다.
  2. 사용자 정의 레이크 파일을 만들었습니다. 내 import.rake라는 이름을 lib/tasks 폴더에 두었습니다. 해당 파일이 코드를 넣습니다
#lib/tasks/import.rake 
require 'csv' 
desc "Imports a CSV file into an ActiveRecord table" 
task :import, [:filename] => :environment do  
    CSV.foreach('myfile.csv', :headers => true) do |row| 
     MyModel.create!(row.to_hash) 
    end 
end 

그런 다음 명령 줄에 bundle exec rake import을 입력합니다.

이 작업을하려면 꽤 SQLite Database Browser가 있어야합니다. 나는 그것이 누군가를 돕기를 바랍니다!

0

CSV 레일 모듈을 사용하여 CSV 파일을 읽을 수 있으며 레코드를 만들 수 있습니다. 여기에 자세한 도움말이 있습니다. Populate db using csv

0

나는 이것을 과거에 사용했습니다. 모든 유형의 모델을 필요로합니다.

rake csv_model_import [토끼.CSV, Bunny]

매력처럼 작동합니다.

desc "Imports a CSV file into an ActiveRecord table" 
 
task :csv_model_import, :filename, :model, :needs => :environment do |task,args| 
 
    lines = File.new(args[:filename]).readlines 
 
    header = lines.shift.strip 
 
    keys = header.split(',') 
 
    lines.each do |line| 
 
    params = {} 
 
    values = line.strip.split(',') 
 
    keys.each_with_index do |key,i| 
 
     params[key] = values[i] 
 
    end 
 
    Module.const_get(args[:model]).create(params) 
 
    end 
 
end

+0

나쁜 샘플, 쉼표 때문에 –