【问题标题】:Writing array into csv file将数组写入csv文件
【发布时间】:2017-06-27 06:34:54
【问题描述】:

我希望脚本将结果保存到 .csv 或 .txt 文件中。我的脚本必须在 mssql 数据库中执行选择,并通过电子邮件发送来自该请求的所有字符串。 我的代码:

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 文件仅包含我的请求的第一行。如何将请求的所有字符串写入文件?

【问题讨论】:

  • 您需要将 results.each 循环放入 CSV.open 块中

标签: ruby-on-rails arrays sql-server ruby csv


【解决方案1】:

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 }

【讨论】:

    【解决方案2】:

    这个怎么样?在结果循环之外创建 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
    

    【讨论】:

    • 这样做时出现错误:C:/Ruby23/lib/ruby/2.3.0/csv.rb:1675:in &lt;&lt;': undefined method map' for nil:NilClass (NoMethodError)跨度>
    • 我在行上用“.to_a”更新了示例,我怀疑这可能是原因。
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 2023-03-31
    • 2018-03-08
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2016-09-27
    相关资源
    最近更新 更多