Array ruby tricks
J’en ai parlé lors de ma session aux MS Techdays.
On vous donne 2 fichiers :
- Le fichier avec les UUID à enlever
- Le fichier avec tous les UUID
Le chalenge, ne garder que les UUID absent :p
Les armes :
- Ruby
- Ben… c’est tout
# Initialisation des variables, je vais utiliser 2 tableaux
remove = []
# J'ouvre les fichiers, et pour chaque ligne la pousser dans son tableau.
# Pour l'exemple, j'utilise 2 méthodes pour remplir les tableaux
all = File.readlines("01-all.csv")
File.open("02-to-remove.csv").each { |l| remove << l }
# Afficher le nombre d'éléments dans chaque tableau
puts "All: #{all.count}"
puts "Remove: #{remove.count}"
# La partie intéressante : la soustraction
keep = all - remove
# J'affiche le nombre d'éléments dans le tableau restant
puts "Keep: #{keep.count}"
# Et vérifie si le nombre d'éléments correspond à ce que je voudrais
puts "Groovy !!!" if keep.count == (all.count - remove.count)
# J'enregistre le résultat dans un fichier
file = File.open("03-to-keep.csv", "w+")
keep.each { |lun| file.puts lun }
file.close>>}
Le résultat :
All: 31
Remove: 7
Keep: 24
Groovy !!!
La version courte de « prod » :
remove = []
all = File.readlines("01-all.csv")
File.open("02-to-remove.csv").each { |l| remove.push l }
keep = all - remove
file = File.open("03-to-keep.csv", "w+")
keep.each { |lun| file.puts lun }
file.close
Si vous voulez générer des fichiers pour faire le test vous même :
all = File.open("01-all.csv", "w")
remove = File.open("02-to-remove.csv", "w")
(0..30).each do
val = rand(10000000000000)
all.puts val
remove.puts val if rand(5) > 3
end
remove.close
all.close
Edit: Sur une suggestion de Ghislain, j’ai modifié le code d’exemple pour ajouter une variante plus courte