2017-02-09 172 views
0

我希望腳本保存結果到.csv或.txt文件中。我的腳本必須執行select into mssql數據庫,並通過電子郵件發送此請求中的所有字符串。 我的代碼:將數組寫入csv文件

require 'tiny_tds' 
require 'csv' 

@db_host = 'myserver.com' 
@db_user = 'mylogin' 
@db_pass = 'mypassword' 
client = TinyTds::Client.new(:host => @db_host, :username => @db_user, :password => @db_pass) 
results = client.execute(" SELECT * FROM mydatabase ") 

results.each do |row| 
p $rows = row.to_a 

p h = $rows 
CSV.open("data.csv", "wb") {|csv| h.to_a.each {|elem| csv << elem} } 
end 

我的問題:

生成CSV文件只包含了我的請求的第一行。我怎樣才能向文件寫入我請求中的所有字符串?

+1

你需要把results.each循環到CSV.open阻止 – Fallenhero

回答

0

這個怎麼樣?在結果循環之外創建CSV。

require 'tiny_tds' 
require 'csv' 

db_host = 'myserver.com' 
db_user = 'mylogin' 
db_pass = 'mypassword' 
client = TinyTds::Client.new(:host => db_host, :username => db_user, :password => db_pass) 
results = client.execute("SELECT * FROM mydatabase") 

CSV.open("data.csv", "wb") do |csv| 
    results.each do |row| 
    csv << row.to_a 
    end 
end 
+0

我時得到這樣的錯誤:C:/Ruby23/lib/ruby/2.3.0/csv.rb:1675:在'<<':未定義的方法'map'爲nil:NilClass(NoMethodError) – Misha1991

+0

我已更新了行中的「.to_a」示例,我懷疑這可能是原因。 – kaspernj

+0

其工作!謝謝 – Misha1991

0

您似乎已在results內有矩陣。所以,與其這樣:

results.each do |row| 
    rows = row.to_a 
    CSV.open("data.csv", "wb") do |csv| 
    rows.to_a.each { |elem| csv << elem} 
    end 
end 

所有你需要的是一個矩陣轉換爲數組的數組,並餵它CSV

results.map! { |row| row.to_a.map(&:to_a) } 
CSV.open("data.csv", "wb") { |csv| csv.replace results }