【问题标题】:Merging CSV tables with Ruby用 Ruby 合并 CSV 表
【发布时间】:2014-07-25 05:23:21
【问题描述】:

我正在尝试将包含股票索引的 CSV 文件与 Ruby 结合起来,并且很难理解那里的文档。时间不早了,我可以找个朋友,所以放轻松:

我有几个文件,标题相同:

["Date", "Open", "High", "Low", "Close", "Volume"]

我希望我的 ruby​​ 脚本读取每个“日期”列,并写入一个新的 CSV,编译从最早日期到最晚日期的所有日期范围。

奖金: 理想情况下,我想将所有其他列数据(“Open”、“High”等)添加到这个新的 CSV 文件中,并由仅包含以下 CSV 文件名的列拆分以供参考。

感谢您对此给予的任何考虑。我真正想做的是与 Ruby 老师坐下来帮助我理解文档。如何使用 CSV.read() 或 CSV.foreach() 做 |x|创建要执行的数组/哈希的方法?

(欢迎理论和明智的回答)

假设:

CSV.read("data/DOW.csv") do |output|
    puts output
end

返回:

[["Date", "Open", "High", "Low", "Close", "Volume"], ["2014-07-14", "71.35", "71.52", "70.82", "71.28", "823063.0"], ["2014-07-15", "71.32", "71.76", "71.0", "71.28", "813861.0"], ["2014-07-16", "71.34", "71.58", "70.68", "71.02", "843347.0"], ["2014-07-17", "70.54", "71.46", "70.54", "71.13", "1303839.0"], ["2014-07-18", "71.46", "72.95", "71.09", "72.46", "1375922.0"], ["2014-07-21", "72.21", "73.46", "71.88", "73.38", "1603854.0"], ["2014-07-22", "73.46", "74.76", "73.46", "74.57", "1335305.0"], ["2014-07-23", "74.54", "75.1", "73.77", "74.88", "1834953.0"]]

如何识别行、列等?我正在寻找将这个数组转换为哈希等的方法或方法。老实说,一个总体理论方法将适合我的需要。

【问题讨论】:

  • 你已经尝试了什么?
  • 如果您提供示例数据和预期输出,应该会很有帮助。
  • 我一直在阅读文档并在 irb 中玩,试图让我的方位无济于事。 CSV.read("path/to/csv") 将我的数据放入数组中,而 CSV.foreach("path/to/csv") 将数据输出到字符串中。我试图在数组的输出上调用一些熟悉的方法,例如 .first 并获得相同的输出。我试图从 CSV 类中找到一些函数并了解操作特定行/列的方法。如果我知道如何在列或行特定数组的数组中导航 CSV 给出的输出,我可以采取下一步
  • 您可以尝试用输出示例重新表述需求和奖励部分吗?
  • 徒弟将通过consulting the options new accepts实现启蒙。如果需要已处理的标头,则必须请求已处理的标头。

标签: ruby csv


【解决方案1】:

我这一天大部分时间都在使用 Ruby 和 CSV,我可能可以提供帮助(即使我自己是初学者)但我不明白你想要什么作为输出(小例子会有所帮助)。

此示例将仅将列“Date”、“High”和“Volume”加载到“my_array”中。

my_array = []
CSV.foreach("data.csv") do |row|
  my_array.push([row[0], row[2], row[5]])
end

如果你想要每一列都试试:

my_array = []
CSV.foreach("data.csv") do |row|
  my_array.push(row)
end

如果要访问数组内的数组元素:

puts my_array[0][0].inspect #=> "Date"
puts my_array[1][0].inspect #=> "2014-07-14"

当你最终得到你想要的输出时,如果你在 Windows 上,你可以从命令提示符处执行此操作以保存它:

my_file.rb > output_in_text_form.txt

【讨论】:

  • +1 我觉得这比我的简单。但是,您仍然需要解释如何提供输出 CSV 文件。
  • 谢谢!一旦他给出了他想要的确切例子,我也许可以做更多:/
【解决方案2】:

你可以这样做:

#!/usr/bin/env ruby

require 'csv'

input = ARGV.shift
output = ARGV.shift

File.open(output, 'w') do |o|
  csv_string = File.read(input)
  CSV.parse(csv_string).each do |r|
    # r is an array of columns. Do something with it.
    ...
    # Generate string version.
    new_csv_row = CSV.generate_line(r, {:force_quotes => true})
    # Write to file
    o.puts new_csv_row
  end
end
  • 使用文件是可选的。您可以使用 shell 重定向并直接从 STDIN 读取和/或直接写入 STDOUT。

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 2012-06-13
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2011-12-18
    • 2018-08-14
    • 2019-12-13
    • 2016-05-10
    相关资源
    最近更新 更多