2017-02-09 177 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 }