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.)