簡體   English   中英

使用多個 CSV 文件中某些列的特定數據加載 Rails 表的最佳方法?

[英]Best way to load Rails table with specific data from certain columns in multiple CSV files?

我有一個 CSV 數據集,其中有 100 多個列,標題分為兩個文件,Rails/PostgreSQL 中有一個表,其字段僅包含特定列數據,大約 60 個特定列。

解析 CSV 並創建一個表條目來填充我需要的特定列的鍵的最佳方法是什么?

作為一個示例,這就是我迄今為止所擁有的:ID、:DESC、:PROGRAM、:PROGRAM_DESC 作為我需要從中提取的數據集中的幾個列名,以及 p_id、description、program_name 和 program_description 作為我表中的字段。

似乎不起作用,所有條目都填充了 nil 值。

file = File.read(Rails.root.join('lib', 'assets', 'test.csv'))
fileCSV = CSV.parse(file, :headers => true)

fileCSV.each do |row|
    Program.create_or_find_by!(p_id: row[:ID], description: row[:DESC], program_name: row[:PROGRAM], program_description: row[:PROGRAM_DESC])
end

我計划為第一個文件中的每個條目創建一個,然后找到條目並匹配它們以更新第二個文件中的必要列。 但是,編寫邏輯以將列與相應字段匹配的最佳方法是什么?

編輯:認為我讓它工作,至少對於這 4 列。

我看過row.to_hash,一開始沒搞懂邏輯,但是想法是把整行保存到一個hash中,然后在創建條目的時候賦值?

file = File.read(Rails.root.join('lib', 'assets', 'test.csv'))
fileCSV = CSV.parse(file, :headers => true)

fileCSV.each do |row|
    rowHash = row.to_hash
    Program.create_or_find_by!(p_id: rowHash['ID'], description: rowHash['DESC'], program_name: rowHash['PROGRAM'], program_description: rowHash['PROGRAM_DESC'])
end

當 ID 是 rowHash 中的符號時,我無法讀取它,但是當它是字符串時,它會讀取,例如 rowHash['ID']。 我在 ID 值上檢查了.class,它讀取為字符串,即使字段接受 integer,ID 是否會正確輸入?

仍在尋找一種從多個 CSV 加載單個條目的有效方法...

試試這個,為我工作

## services/programs/csv.rb
require 'csv'
module Programs
    class Csv
        def self.import(file)
            new(file).import
        end
        
        def import
            CSV.foreach(file.path, col_sep: ';', headers: true, encoding: 'bom|utf-8', strip: true) do |row|
                data = row.to_h
                p = Program.where(p_id: data['ID']).first_or_initialize
                p.description = data['Desc']
                p.program_name = data['PROGRAM']
                p.program_description = data['PROGRAM_DESC']
                p.save
            end
        end
        
        def initialize(file)
           @file = file
        end

    attr_accessor :file
    end
end

並在需要的地方調用Programs::Csv.import(file) 這個設置對我有用,我希望它對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM