【问题标题】:How to import a column of a CSV file into a Ruby array?如何将 CSV 文件的一列导入 Ruby 数组?
【发布时间】:2014-11-18 02:06:02
【问题描述】:

我的目标是将 CSV 文件的一列导入 Ruby 数组。这是一个独立的 Ruby 脚本,而不是应用程序。我将在终端中运行脚本并获得输出。

我无法找到导入文件的最佳方式以及将文件名动态插入该代码行的最佳方式。文件名每次都不一样,由用户传入。我使用$stdin.gets.chomp 向用户询问文件名,并将其设置为等于file_name

有人可以帮我解决这个问题吗?这是我对这部分脚本的内容:

require 'csv'
    zip_array = CSV.read("path/to/file_name.csv")

我需要能够在上面插入正确的文件路径。它是否正确?以及如何在其中获取该路径名?也许我需要完全重新构建我的脚本,但是关于如何做到这一点有什么建议吗?

【问题讨论】:

  • 要求输入的程序通常非常烦人。为什么不将文件名作为命令行参数?这些在ARGV 中可用。
  • 您可以使用 Dir.glob("*.csv")[0] 如果该文件(与名称无关)将是您的程序文件夹中唯一的 csv 文件。这样您就不必担心名称一直在变化。

标签: ruby arrays bash csv terminal


【解决方案1】:

好的,第一个问题:

a) 每次运行的文件名都会不同(我想它总是一个 CSV 文件,对吧?)

您可以通过在 Ruby 脚本中创建一个文件夹来解决此问题,例如 input_data。然后做:

Dir.glob('input_data/*.csv')

这将在该文件夹中生成以 CSV 结尾的所有文件的数组。如果我们假设该文件夹中一次只有一个文件(使用不同的名称),我们可以这样做:

file_name = Dir.glob('input_data/*.csv')[0]

这样,无论文件名为什么,您都将动态获取文件路径。如果 csv 文件与您的 Ruby 脚本位于同一目录中,您可以这样做:

Dir.glob('*.csv')[0]

现在,仅将 1 列导入 Ruby 数组(假设它是第一列):

require 'csv'
array = []
CSV.foreach(file_name) do |csv_row|
  array << csv_row[0] # [0] for the first column, [1] for the second etc.
end

如果您的 CSV 文件有标题怎么办?假设您的列名是“总计”。你可以这样做:

require 'csv'
array = []
CSV.foreach(file_name, headers: true) do |csv_row|
  array << csv_row['Total']
end

现在不管你的列是第 1 列、第 3 列等等,只要它有一个名为“Total”的标题,Ruby 就会找到它。

CSV.foreach 逐行读取您的文件,适用于大文件。 CSV.read 将立即读取它,但使用它可以使您的代码更简洁:

array = CSV.read(, headers: true).map do |csv_row|
  csv_row['Total']
end

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我认为这里有两个问题。第一个是关于从命令行获取用户输入。通常的方法是使用ARGV。在您的程序中,您可以使用file_name = ARGV[0],这样用户就可以在命令行中输入ruby your_program.rb path/to/file_name.csv

    接下来是关于读取 CSV。使用 CSV.read 将占用整个 CSV,而不仅仅是一列。如果您想从众多列中选择一列,您最好这样做:

    zip_array = []
    CSV.foreach(file_name) { |row| zip_array << row[whichever_column] }
    

    【讨论】:

      【解决方案3】:

      首先,你需要将$stdin.gets.chomp的返回值赋给一个变量:

      foo = $stdin.gets.chomp
      

      这会将输入的输入分配给foo

      你不需要使用$stdin,因为gets默认使用标准输入通道:

      foo = gets.chomp
      

      此时使用该变量作为您的read 参数:

      zip_array = CSV.read(foo)
      

      这是所有基本编码,任何语言介绍书中都包含这些内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-18
        • 2019-05-19
        • 1970-01-01
        • 2012-01-17
        • 2020-01-09
        • 2012-01-29
        • 1970-01-01
        • 2012-08-05
        相关资源
        最近更新 更多