2016-12-06 73 views
1

我必須在以下格式的文本文件中的一些數據:保存數據

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數據庫該表的列將是:名稱,值1,值2,值3,...,值11。並且這些行是文件每一行上的每條數據,因此該表的第一行將是:Cat,3,24,2,2,4,6,4,7,6,0,0。

我有我的數據類的設置如下:

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 - 爲名稱未定義的方法`驗證器:類。

+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] 

現在,你有所需的變量,你可以把它們寫入到數據庫。 要做到這一點,你可以創建params散列,爲您的數據的預期屬性:

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 

注意:不要叫你的類數據,它在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, ... 
+0

謝謝你,這正是我正在尋找的。它究竟如何存儲它?如果我把它放在一個def塊中,它會將它作爲一個散列或其他東西返回嗎? – FlameDra

+0

查看更新。您可以直接在循環內創建MyData對象。 –

+0

我試着將我編輯的代碼放入我的文章中,但數據庫已創建,但由於某種原因尚未填充。它使用Sinatra以防萬一。 – FlameDra