从 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
我正在尝试使用 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