CSV 데이터를 Ruby on Rails 7로 가져오기

5874 단어 railsruby
경우에 따라 양식을 통해 데이터 항목을 추가하는 대신 데이터베이스로 가져올 빅 데이터가 있습니다. 따라서 csv 파일을 사용하여 해당 데이터를 데이터베이스의 다른 테이블로 가져옵니다.

기본적으로 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는 고유 인덱스가 있는 열에서만 작동합니다.


행복한 코딩!

좋은 웹페이지 즐겨찾기