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