【问题标题】:Read a CVS/JSON file and navigate through it by inputting a value from a column读取 CVS/JSON 文件并通过输入列中的值来浏览它
【发布时间】:2019-06-10 14:46:24
【问题描述】:

我希望能够通过输入特定列的值来仅打印文件的一行。我对 Ruby 很陌生,我只是从基础开始,我找到的关于 CSV 类的指南对我来说还不够清楚。基本上,我可以打印出整个 CSV,但不仅仅是其中的一行。

例如:

Column A,Column B
Pizza,Pie
Papa,John

假设我有这个 CSV,我想创建一个代码,通过一个特定的列(例如 B)搜索用户输入(gets.chomp?)。所以,如果我写“Pie”,它应该打印 Pizza, Pie。或者更好的是,让我访问该特定数组(行的数组)中的项目并将它们存储为变量,我可以按照我想要的任何顺序打印出来。

由于我缺乏专业知识,我只能打印整个数组(所有行、所有列),但肯定你们中的一个人必须知道如何做我正在尝试的事情,或者至少让它更清楚比我在网上能找到的信息。

这是我设法在网上找到的非常基本的代码,但我还无法超越它。

CSV.foreach('file.csv') do |row|
  puts row.inspect
end

【问题讨论】:

    标签: ruby csv


    【解决方案1】:

    如果您不提供块 (do |row| ... end),CSV.foreach 将返回一个枚举器。这很有用,因为您可以使用任何 Enumerable 方法,例如 selectsort 或...find

    #                                                    ↓↓↓↓
    matching_row = CSV.foreach(file_path, headers: true).find do |row|
      row["Column B"].include?("Pie")
    end
    # => #<CSV::Row "Column A":"Pizza" "Column B":"Pie">
    
    p matching_row["Column A"] # => Pizza
    

    这很容易变成一个采用(例如)列名和值参数的方法:

    def find_row_in_csv(file_path, column_name, search_value)
      CSV.foreach(file_path, headers: true).find do |row|
        row[column_name].include?(search_value)
      end
    end
    
    matching_row = find_row_in_csv("data.csv", "Column B", "Pie")
    # => #<CSV::Row "Column A":"Pizza" "Column B":"Pie">
    

    您可以在 repl.it 上看到这一点:https://repl.it/@jrunning/ImmaculateGummyVoxels

    【讨论】:

    • 感谢您保持简单,现在非常清楚! P.S:值之前的空格不在文件中,我只是在编写示例时搞砸了。
    【解决方案2】:
    matching_rows = []
    input = STDIN.gets.chomp
    CSV.foreach('file.csv') do |row|
      matching_rows << row if row[1].to_s.include?(input)
    end
    
    pp matching_rows
    

    【讨论】:

    • 你能详细说明你的答案吗?
    猜你喜欢
    • 2012-11-26
    • 2021-02-07
    • 2017-01-22
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多