【问题标题】:Adding Columns (SQL Queries) to a CSV File in Ruby在 Ruby 中将列(SQL 查询)添加到 CSV 文件
【发布时间】:2016-06-05 22:27:46
【问题描述】:

我一直无法弄清楚如何在 Ruby 中将其他列而不是行写入 CSV 文件。在这种情况下,它们是 SQL 查询。

我的代码片段:

month = mysql.query("SELECT DATE_FORMAT(company_db.dates.starting_date,'%m') FROM company_db.dates.starting_date;")

day = mysql.query("SELECT DATE_FORMAT(company_db.dates.starting_date,'%d') FROM company_db.dates.starting_date;")

year = mysql.query("SELECT DATE_FORMAT(company_db.dates.starting_date,'%Y') FROM company_db.dates.starting_date;")

CSV.open("Dates.csv, "wb") do |csv|
  csv << ["Month", "Day", "Year"]
  csv << [(month.each {|row| csv << row}), (day.each {|row| csv << row}), (year.each {|row| csv << row})]
end

我得到的输出:

Month, Day, Year
1,
.
.
.
12,
1,
.
.
.
31,
1970,
  .
  .
  .
2015

以及我想要的输出:

Month, Day, Year
1, 1, 1970
.  .    .
.   .    .
.    .    .
12, 31, 2015

感谢您的帮助。

【问题讨论】:

  • 为什么不把你的三个sql语句合二为一呢? mysql.query("SELECT DATE_FORMAT(company_db.dates.starting_date,'%m'), DATE_FORMAT(company_db.dates.starting_date,'%d'), DATE_FORMAT(company_db.dates.starting_date,'%Y') FROM company_db.dates.starting_date;")
  • 我知道该怎么做。那不是我问的问题。
  • 你能显示查询的输出对象吗?

标签: mysql sql ruby csv


【解决方案1】:

我相信 Enumerable.zip 是您正在寻找的方法。

鉴于您的三个查询:

csv << [ 'Month', 'Day', 'Year' ]
csv << month.zip( day, year )

【讨论】:

  • 我收到以下错误:iMac:Workspace guy$ ruby File.rb File.rb:105:in 'block in &lt;main&gt;': undefined method 'zip' for #&lt;Mysql::Result:0x007fd3e11add00&gt; (NoMethodError) from /Users/guy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/csv.rb:1282:in 'open' from File:103:in '&lt;main&gt;' 我也使用了您的确切代码。
  • 不知道您使用哪个 Gem 进行 Mysql 连接,我希望结果公开的 .each 接口来自 Enumerable,这显然与您使用的不相关。 mysql2sequel ( gems ) 都支持 Enumerable 接口,这将使上述工作。
  • mysql2 gem 将查询记录为hash =&gt; value 对而不是数组,因此我可能需要更多地使用我的代码才能使其正常工作。它确实按列而不是按行添加了所有内容,所以这确实帮助了我很多。谢谢。
  • 你可以告诉mysql2返回数组而不是哈希。 Mysql2::Client.default_query_options.merge!(:as =&gt; :array) 在脚本的早期应该在脚本的整个生命周期内进行更改。
  • 这也有很大帮助,但现在我在给定的列中有["10"] 而不仅仅是10。几个小时以来真正困扰我的是,如果我愿意,而不是加入year 的查询,而是将一个多列SELECT 粘贴到.zip 中,所有信息都包含在一个列中而且我无法拆分它。尽管您最初在这里回答了我的问题,但我最终可能会问一个不太简单但更具体的问题。
【解决方案2】:
results = mysql.query("SELECT DATE_FORMAT(company_db.dates.starting_date,'%m') AS month, DATE_FORMAT(company_db.dates.starting_date,'%d') AS date, DATE_FORMAT(company_db.dates.starting_date,'%Y') AS year FROM company_db.dates.starting_date;")

CSV.open("Dates.csv, "wb") do |csv|
  csv << ["Month", "Day", "Year"]
  results.each do |row|
    csv << [row.month, row.date, row.year]
  end
end

【讨论】:

  • 你的意思是写:CSV.open("Dates.csv, "wb") do |csv| csv &lt;&lt; ["Month", "Day", "Year"] mysql.query("SELECT DATE_FORMAT(company_db.dates.starting_date,'%m'), DATE_FORMAT(company_db.dates.starting_date,'%d'), DATE_FORMAT(company_db.dates.starting_date,'%Y') FROM company_db.dates.starting_date;").each {|row| csv &lt;&lt; row} end 没有回答我的问题。
  • AS month等会报错。这也是多余的,因为csv &lt;&lt; ["Month", "Day", "Year"] 已经建立了列标题。我设置单独的查询等于不同的变量,因为我最终需要拆分行并根据我从数据库中提取的日期来操作行数。 IE。如果某一行中的开始日期早于另一行,则该行将在拆分期间获得更多行。我也找不到另一个直接回答这个问题的问题。我希望得到那个答案。
猜你喜欢
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2019-03-03
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多