0

「ユーザー」と「登録」の 2 つの CSV ファイルがあります。

001.csv:

user_id,user_name,state
12345,test_account,active

002.csv:

course_id,user_id,state
67890,12345,active

active_enrollments.csv のようなファイルを 1 つ作成する必要があります。

course_id,user_name
67890,test_account

ファイルを複数回ループせずに、これらを解析してファイル active_enrollments.csv を生成するにはどうすればよいですか?

ここに私がこれまでに持っているものがありますが、多くの重複があります:

require 'csv'

CSV.open("active-enrollments.csv", "wb") do |csv|
  csv << ["course_id", "user_name", "user_id","course_name", "status"]
end
Dir["csvs/*.csv"].each do |file|
  #puts file
CSV.foreach(file, :headers => true) do |row|
if row['user_id'] && row ['course_id'] #finds enrollment csvs
  if row['state'] == "active" #checks for active enrollments
    state = row['state']
    course_id = row['course_id']
    user_id = row['user_id']
    Dir["csvs/*.csv"].each do |files|
      CSV.foreach(files, :headers => true) do |user|
        if user['user_name']
          if user_id == user['user_id']
            user_name = user['user_name']
            Dir["csvs/*.csv"].each do |file|
              CSV.foreach(file, :headers => true) do |courses|
                if course_id == courses['course_id']
                  course_name = courses['course_name']
                  CSV.open("active-enrollments.csv", "a") do |csv|
                    csv << [course_id, user_name, user_id, course_name, state]
                  end
                end 
              end
            end
          end
        end
      end
    end
  end
end
end
end

これが簡単であることはわかっていますが、ファイルを複数回ループして多くの重複を生成しないと取得できないようです。

4

3 に答える 3

2

データベースや本格的なモデルの束を使用する代わりに、ルックアップとして単純なハッシュを使用することをお勧めします。

以下はテストされておらず、すべてのフィルターを除外しました。

登録 csvs からユーザーを名前で分離し、ユーザー csvs を 1 回繰り返して、 によるルックアップを作成しますuser_id

users_csvs = Dir['csvs/users-*.csv']
enrollment_csvs = Dir['csvs/enrollment-*.csv']

users = {} 
users_csvs.each do |user_file|
  CSV.foreach(user_file, :headers => true) do |row|
    # Put in whatever data you will need later
    users[row['user_id']] = {:user_name => row['user_name'], :state => row['state']}
  end
end

consolidated_csv = []
enrollment_csvs.each do |enrollment_file|
  CSV.foreach(enrollment_file, :headers => true) do |row|
    user_id = row['user_id']
    if user = users[user_id]
      # Put in whatever you want from the two objects
      consolidated_csv << {:course_id => row['course_id'], :user_name => row['user_name']}
    end
  end
end

CSV.open("active-enrollments.csv", "wb") do |csv|
   csv << ['course_id', 'user_name']
   consolidated_csv.each { |row| csv << [row[:course_id], row[:user_name]] }
end
于 2013-07-09T05:15:26.100 に答える
1

おそらく、Sqlite を使用して CSV ファイルからデータを取得し、一時データベースに貼り付けてから、データベースにクエリを実行して最終出力を生成する方が簡単でしょう。

于 2013-07-09T03:37:33.097 に答える