从 csv 创建数据库后出现错误字符

bad char after creating a Database from csv

我正在尝试使用 mongoid 创建数据库,但找不到创建方法。我正在尝试基于 csv 文件创建 2 个数据库:

extract_data class:

class ExtractData

  include Mongoid::Document
  include Mongoid::Timestamps

  def self.create_all_databases
    @cbsa2msa = DbForCsv.import!('./share/private/csv/cbsa_to_msa.csv')
    @zip2cbsa = DbForCsv.import!('./share/private/csv/zip_to_cbsa.csv')
  end

  def self.show_all_database
    ap @cbsa2msa.all.to_a
    ap @zip2cbsa.all.to_a
  end

end

class DbForCSV 的工作原理如下:

class DbForCsv
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Attributes::Dynamic

  def self.import!(file_path)
    columns = []
    instances = []
    CSV.foreach(file_path, encoding: 'iso-8859-1:UTF-8') do |row|
      if columns.empty?
        # We dont want attributes with whitespaces
        columns = row.collect { |c| c.downcase.gsub(' ', '_') }
        next
      end
      instances << create!(build_attributes(row, columns))
    end
    instances
  end

  private

  def self.build_attributes(row, columns)
    attrs = {}
    columns.each_with_index do |column, index|
      attrs[column] = row[index]
    end
    ap attrs
    attrs
  end
end

我不知道所有字段,它可能会及时更改。这就是我创建数据库和通用方法的原因。

解决 'create!' 问题后,我还有另一个问题。

我正在使用编码来确保只处理 UTF8 字符,但我仍然看到:

{
       "zip" => "71964",
         "cbsa" => "31680",
    "res_ratio" => "0.086511098",
    "bus_ratio" => "0.012048193",
    "oth_ratio" => "0.000000000",
    "tot_ratio" => "0.082435345"
}

在代码中执行 'ap attrs' 时。如何确保 'zip' -> 'zip'

谢谢

create! 是一个 class 方法,但您试图将其作为实例方法调用。您的 import! 方法也不应该是实例方法,它应该是 class 方法,因为它会生成 class:

的实例
def self.import!(file_path)
  #-^^^^
  # everything else would be the same...
end

您还可以将 build_attributes 设为 class 方法,因为它只是另一个 class 方法的辅助方法:

def self.build_attributes
  #...
end

然后在使用 import!:

时就不需要那个看起来很奇怪的 new 调用了
def self.create_all_databases
  @cbsa2msa = DbForCsv.import!('./share/private/csv/cbsa_to_msa.csv')
  @zip2cbsa = DbForCsv.import!('./share/private/csv/zip_to_cbsa.csv')
end