2016-10-02 66 views
2

この質問に似た回答がありましたが、私のコードにはより具体的なものが必要です。基本的に私はCSVファイルから行を呼び出しましたが、今は呼び出された行を削除する必要があります。私はこれをまだ書いていますが、ここで私は皆に助けを求めています。私はここにたくさんのコードがあることを知っていますが、文脈を理解することがより容易になるほど、より多くのものがあると考えました。コードにノイズが多すぎると謝罪します。Rubyを使ってCSVファイルから行を削除する

def delete_user_menu 
    puts "============================================" 
    delete_users_active_list 
    puts " " 
    puts "Please type in the name of the user you wish to eradicate: " 
    print "> " 
    eradicate(gets.chomp) 
end 

def eradicate(delete_input) 
    delete_row = delete_authentication(delete_input) 
    if delete_row 
    puts "Are you sure you want to delete #{delete_input} from the database?" 
    puts "[y]es or [n]o" 
    print "> " 
    delete_answer = gets.chomp 
    if delete_answer == "y" 
     delete_user 
     after_deletion_menu 
    elsif delete_answer == "n" 
     puts "Close call! Taking you back to main menu." 
     sleep 2 
     admin_main_menu 
    else 
     puts "Input not recognised. Please try again." 
     eradicate(delete_input) 
    end 
    else 
    puts "User not recognized. Please try again." 
    sleep 1 
    delete_user_menu 
    end 
end 

def delete_user 
    # this is where the delete user function needs to go 
    after_deletion_menu 
end 

def after_deletion_menu 
    puts " " 
    puts "User deleted! What would you like to do now?" 
    puts "1. Delete another user" 
    puts "2. Back to main menu" 
    print "> " 
    after_deletion_choice = gets.chomp 
    if after_deletion_choice == "1" 
    delete_user_menu 
    elsif after_deletion_choice == "2" 
    admin_main_menu 
    else 
    puts "Input not recognized. Please try again." 
    after_deletion_menu 
    end 
end 

def delete_users_active_list 
    CSV.foreach("./users.csv", headers: true) do |row| 
    username = row['username'] 
    puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
    puts "Username: #{username}" 
    end 
end 

def delete_authentication(username) 
    CSV.open('users.csv', headers: true).find { |row| row['username'] == username } 
end 

私はこの質問How to remove a row from a CSV with Ruby を見て持っていたが、私はここにいる理由を私は完全にそれゆえ、答えを理解していません。どんな助けも大歓迎です。

答えて

1

私はリンクを見ました。まず、それらはtableに全体のCSVファイルを読んでいる:

table = CSV.table(@csvfile) 

を次にtableから行を削除:

table.delete_if do |row| 
    row[:foo] == 'true' 
end 

最後に、それらは、完全に新しいtableと元のファイルマイナスの行を交換します。

File.open(@csvfile, 'w') do |f| 
    f.write(table.to_csv) 
end 

これは、通常、この種の操作をwファイル。それはデータベースのようなものではありません。

EDIT - あなたの場合:応答のための

delete_user(delete_input) 
... 
def delete_user(user) 
    ... 
    table.delete_if { |row| row[:username] == user } 
    ... 
+0

おかげで、私は私のコードにこれを実装しようとしましたが、それは正確に動作しませんか?私は何のエラーも出ていない、それは何も変更していないだけです。 @csvfileビットをCSVファイル名に置き換え、:fooを:usernameに置き換えました。私がやるべきことが他に何かありますか? – thomasgee

+0

@thomasgee - あなたは実際のユーザー名で 'true'を置き換えましたか? – seph

+0

は、csvファイルに複数のユーザーがいるためオプションではないので、(delete_input)がコードを使って選択されたユーザー名(gets.chompから)を参照していることがわかります。 – thomasgee

関連する問題