将数据从文本文件保存到SQL数据库

时间:2016-12-06 22:14:40

标签: ruby

我在文本文件中有一些数据,格式如下:

Cat 3 24 2 2 4 6 4 7 6 0 0
Dog 18 0 8 2 42 6 6 4 5 8 0 
Mouse 8 1 2 2 4 6 4 7 6 0 0
Rabbit 8 10 8 26 46 2 6 7 6 10 0

我想写一个Ruby脚本,它可以获取这些数据并将其存储在SQLite数据库中,其中表的列将是:Name,Value1,Value2,Value3,....,Value11。行是文件每一行的每一行数据,因此表格的第一行将是:Cat,3,24,2,2,4,6,4,7,6,0,0。 / p>

我的数据设置类如下:

require 'dm-core'
require 'dm-migrations'


DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/development.db")

class Data
  include DataMapper::Resource
  property :id, Serial
  property :name, String
  property :value1, Integer
  property :value2, Integer
  property :value3, Integer
  property :value4, Integer
  property :value5, Integer
  property :value6, Integer
  property :value7, Integer
  property :value8, Integer
  property :value9, Integer
  property :value10, Integer
  property :value11, Integer
end

DataMapper.finalize
DataMapper.auto_upgrade!

在我的app.rb中,我正在尝试写下可以解析这些数据并创建并将其写入数据库的逻辑。我也在使用Sinatra。我该怎么做呢?

编辑:更新了app.rb文件

require 'sinatra'
require 'slim'
require 'sass'
require './Names'
require 'rubygems'
require 'data_mapper'

get '/' do

  File.readlines("data.txt").each do |line|
    name, *values = line.split
    params = {:name => name}
    values.each_with_index do |value, i|
      params[:"value#{i+1}"] = value
    end
    my_data = Names.new params #class renamed to Names
    my_data.save
  end

end

当我这样做时,我得到一个NoMethodError - 名字的未定义方法`validators':Class。

1 个答案:

答案 0 :(得分:1)

这是一个开始:

File.readlines('data.txt').each_with_index do |line, i|
  name, *values = line.split
  values.map!{|v| v.to_i}
  puts i
  puts name
  puts values.inspect
end

您可以获得每行的索引,名称和值。

它返回:

0
Cat
[3, 24, 2, 2, 4, 6, 4, 7, 6, 0, 0]

1
Dog
[18, 0, 8, 2, 42, 6, 6, 4, 5, 8, 0]

2
Mouse
[8, 1, 2, 2, 4, 6, 4, 7, 6, 0, 0]

3
Rabbit
[8, 10, 8, 26, 46, 2, 6, 7, 6, 10, 0]

现在您已拥有所需的变量,您可以将它们写入数据库。 为此,您可以使用数据的预期属性创建一个参数哈希:

File.readlines('data.txt').each do |line|
  name, *values = line.split
  params = {:name => name}
  values.each_with_index do |value, i|
    params[:"value#{i+1}"] = value
  end
  my_data = MyData.new params
  my_data.save
end

puts MyData.count # => 4

注意:不要调用你的类Data,它已经在Ruby中定义了,你会得到奇怪的错误。

独立示例

一切都放在一起:

require 'dm-core'
require 'dm-migrations'

# Initialize Database

DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/development.db")

class MyData
  include DataMapper::Resource
  property :id, Serial
  property :name, String
  property :value1, Integer
  property :value2, Integer
  property :value3, Integer
  property :value4, Integer
  property :value5, Integer
  property :value6, Integer
  property :value7, Integer
  property :value8, Integer
  property :value9, Integer
  property :value10, Integer
  property :value11, Integer
end

DataMapper.finalize
DataMapper.auto_upgrade!

# Parse file and save data in DB

File.foreach('data.txt') do |line|
  name, *values = line.split
  params = { name: name }
  values.each_with_index do |value, i|
    params[:"value#{i + 1}"] = value
  end
  MyData.create params
end

puts MyData.count # => 4, then 8, then 12, ...