CSV 데이터를 Ruby on Rails 7로 가져오기
기본적으로 CSV 파서는 레일에 내장되어 있습니다. 사용하려는 파일에
require 'csv'
만 있으면 됩니다.데이터를 가져오는 동안 백그라운드 작업을 사용하는 것이 좋습니다. 데이터를 처리하기에는 너무 크고 요청이 완료될 때까지 대기 상태로 유지되기 때문입니다.
CSV 파일 경로
먼저 파일 경로를 가져와야 합니다.
def csv_file_path
# give url to csv file
@csv_file_path ||= File.read("https://...")
end
csv 초기화
이제 읽을 파일의 경로가 생겼습니다. 이제 해당 데이터를 사용하여 가져올 수 있도록 이 파일을 구문 분석합니다.
def csv
@csv ||= CSV.parse(csv_file_path, col_sep: ",", row_sep: :auto, skip_blanks: true)
end
따라서 경로 메서드를 호출하고 파일의 데이터가 구분 기호
,
와 행 구분 기호를 자동으로 사용하고 공백인 경우 행을 건너뛸 것임을 설명하는 파일을 구문 분석합니다.이제
csv.count
를 호출하여 파일의 행 수를 확인할 수도 있습니다.데이터 가져오기
내 파일에 구독자의 이름과 이메일이라는 두 개의 열이 있고 사용자 지정 목록에 구독자를 추가하고 싶다고 가정해 보겠습니다.
나는
user
가 많은 lists
모델을 가지고 있고 subscriber
많은 lists
모델도 가지고 있습니다. 이제 list
에는 subscribers
에서 list_subscriber
모델이 많이 있습니다.csv.each_with_index do |row, index|
next if index == 0 # skip headers
subscriber = Subscriber.find_or_initialize_by(email: row[1])
subscriber.name = row[0]
next unless subscriber.valid? # skip if subscriber data is invalid
imported_subscriber << {name: subscriber.name, email: subscriber.email}
end
# save imported students
imported_subscriber_ids = Subscriber.upsert_all(imported_subscribers, returning: %w[id], unique_by: :email)
if imported_subscrriber_ids.present?
# update list with imported subscribers
list_subscribers = imported_subscriber_ids.map { |id| {subscriber_id: id["id"], list_id: list_id} }
imported_list_subscribers = ListSubscriber.upsert_all(list_subscribers, returning: %w[id], unique_by: :index_list_subscribers_on_list_id_and_subscriber_id)
end
그리고 비올라! 이제 연락처를 가져옵니다.
upsert_all
메서드는 Rails 6에 내장되어 있으며 한 번의 호출로 데이터를 가져오고 unique_by
생성할 복제 행을 중지합니다.list_subscriber
는 listId와 subscriberId에 고유한 인덱스를 가지고 있으므로 index_list_subscribers_on_list_id_and_subscriber_id
를 호출하여 직접 인덱스 이름을 사용할 수 있습니다. 그렇지 않으면 uniq_by
는 고유 인덱스가 있는 열에서만 작동합니다.행복한 코딩!
Reference
이 문제에 관하여(CSV 데이터를 Ruby on Rails 7로 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sulmanweb/import-csv-data-to-ruby-on-rails-7-2a0a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)