Прочитайте файл CVS / JSON и просмотрите его, введя значение из столбца. - PullRequest
0 голосов
/ 10 июня 2019

Я хочу иметь возможность распечатать только одну строку файла, введя значение определенного столбца.Я очень новичок в Ruby, я только начинаю с основ, и руководства, которые я нашел о классе CSV, не достаточно ясны для меня.По сути, я могу распечатать весь CSV, а не только один его ряд.

Например:

Column A,Column B
Pizza,Pie
Papa,John

Скажем, у меня есть этот CSV, я хочу создатькод, который будет искать пользовательский ввод (gets.chomp?) через один определенный столбец (например, B).Итак, если я напишу «Пирог», на нем должна быть надпись «Пицца, Пирог».Или, что еще лучше, позвольте мне получить доступ к элементам в этом конкретном массиве (элементу строки) и сохранить их в виде переменных, которые я могу распечатать в любом порядке.

В отсутствие у меня опытаудалось распечатать только весь массив (все строки, все столбцы), но наверняка один из вас должен знать, как сделать то, что я пытаюсь, или хотя бы сделать его более понятным, чем информация, которую я могу найти в Интернете.

Это очень простой код, который мне удалось найти в Интернете, но я пока не могу пройти мимо него.

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

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Если вы не предоставите блок (do |row| ... end), CSV.foreach вернет перечислитель.Это полезно, потому что вы можете использовать любой метод Enumerable, например select, sort или ... 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

0 голосов
/ 10 июня 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...