在Ruby中删除整个数组

时间:2017-10-13 16:24:49

标签: arrays ruby csv

我试图找出是否可以使用自身调用的方法删除数组。 array.clear删除所有元素,但不删除数组本身。

上下文

这是上下文。我有一个没有标题的CSV文件。我希望能够删除行中给定一个值的行。因此,用户可以传递给我“巧克力”,我搜索CSV并删除巧克力作为第一个值的行。

CSV文件

Chocolate, some description blah
Cheese, some description about this one

Ruby文件

require 'csv'

def remove_recipe(recipe_name)
  CSV.foreach(csv_file_path, w+) do |row|
    row.clear??? if row[0] == recipe_name
  end
end

我可以添加一个标题,但我想知道是否可以没有。

好的,按照Sawa的要求描述输入和输出:用户将输入字符串“Chocolate”。我将在CSV文件中搜索该字符串。如果存在,我想更新CSV文件以删除包含该字符串的行。

2 个答案:

答案 0 :(得分:3)

将CSV解析为数组数组并删除要删除的元素:

require "csv"

def remove_recipe(recipe_name)
  csv_ary = CSV.read("path/to/file.csv")
  cleaned_csv_ary = csv_ary.reject { |row| row[0] == recipe_name }
  # etc
end

在我写“etc”的地方,您可以根据需要使用已清理的数组,包括通过#to_csv将其转换为CSV字符串并将其写入文件。

答案 1 :(得分:2)

如果您要更新CSV文件,那么这是我能提出的最简洁的解决方案:

require "csv"

def remove_recipe(name)
  rows = CSV.read('test.csv')
  rows.reject! { |r| r[0] == name }
  out = rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join("")
  File.open('test.csv', 'w+') { |file| file.write(out) }
end

remove_recipe('Chocolate')