我试图找出是否可以使用自身调用的方法删除数组。 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文件以删除包含该字符串的行。
答案 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')